На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Обязательно выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Этот раздел предназначен для вопросов, посвященных разработке компонентов, а также для тестирования собственных бесплатных компонентов с открытым исходным кодом.

Здесь запрещается:
1. Размещать ссылки на какие-либо коммерческие компоненты, реализующие требуемую функциональность.
2. Обсуждать и тестировать коммерческие компоненты или компоненты с закрытым кодом.
3. Давать ссылки на сайты с исходным кодом компонентов. Все тестируемые исходные коды должы быть размещены на сайте ИСХОДНИКИ.RU.
Модераторы: Rouse_, DimaBr
Страницы: (3) 1 [2] 3  все  ( Перейти к последнему сообщению )  
> Как вызвать событие? , Есть поток из него надо вызвать событие
    примерно так:

    ExpandedWrap disabled
      Synchronize(Self.Component.OnRead(Self.Component));
      я так понял мне надо поток в компонент не впихивать?
        почему же можешь впихивать, просто обращаться из потока к компоненту нужно с помощью Synchronize
          приведи пример кода
          потому что так не компилится да и не должно
          ExpandedWrap disabled
            type
              vmUDPSocket = class(TComponent)
              private
                SActive : boolean;
                SPort : longint;
                SBufSize : longint;
                WSAData : TWSAData;
                UDPSock : TSocket;
                ToAddr : TSockAddr;
                FromAddr : TSockAddr;
                RecTh : RecThread;
                EventRead : TNotifyEvent;
              protected
              public
                procedure Startup;
                procedure Cleanup;
              published
                property Active : boolean read sActive write sActive;
                property Port : integer read SPort write SPort;
                property BufferSize : longint read SBufSize write SBufSize;
                property OnRead : TNotifyEvent read EventRead write EventRead;
              end;
              RecThread = class(TThread)
              public
                RecSocket : TSocket;
                ReadSize : longint;
                status : longint;
                Component : vmUDPSocket;
              private
                WSAData : TWSAData;
                procedure recvdata(sock:TSocket);
              protected
                procedure Execute; override;
              end;
            Цитата v1m @
            потому что так не компилится да и не должно

            Не слышал про forward-объявления ?
            ExpandedWrap disabled
              RecThread = class; //= forward
               
              vmUDPSocket = class(TComponent)
                ...
              end;
               
              RecThread = class(TThread)
              ...
              end;
              нет :D я до этого на паскале прогал))) да и сейчас прогаю ток в олимпиадном программировании))
                я так ничего и непонял как мне синхронизировать
                это
                ExpandedWrap disabled
                  vmUDPSocket = class(TComponent)
                    private
                      SActive : boolean;
                      SPort : longint;
                      SBufSize : longint;
                      WSAData : TWSAData;
                      UDPSock : TSocket;
                      ToAddr : TSockAddr;
                      FromAddr : TSockAddr;
                      RecTh : RecThread;
                      EventRead : TNotifyEvent;
                    protected
                    public
                      procedure Startup;
                      procedure Cleanup;
                    published
                      property Active : boolean read sActive write sActive;
                      property Port : integer read SPort write SPort;
                      property BufferSize : longint read SBufSize write SBufSize;
                      property OnRead : TNotifyEvent read EventRead write EventRead;
                    end;

                с этим
                ExpandedWrap disabled
                  RecThread = class(TThread)
                    public
                      RecSocket : TSocket;
                      ReadSize : longint;
                      status : longint;
                      Component : vmUDPSocket;
                    private
                      WSAData : TWSAData;
                      procedure recvdata(sock:TSocket);
                    protected
                      procedure Execute; override;
                    end;

                я же тут как то Сomponent должен синхронизировать с компонентом иначе нету события


                я сделал таймер на форме и RecThread в компоненте поместил в public и запрашивал прием сразу из потока все кул но как синхронизировать мой компонент по нормальному?
                Сообщение отредактировано: v1m -
                  Вопрос с синхронизацией на самом деле спорный. Я уже ссылался на библиотеку Indy как пример. Вызов некоторых событий из доп. потоков может быть чертой компонента.
                  Однако, в данном конкретном случае я советую не использовать Synchronize, а посылать свое сообщение (назвать его можно было бы, например, CM_DATAREAD), вызывать обработчик соответствующего события из процедуры обработки сообщения (она будет вызвана из основного потока). В параметрах сообщения указатель на буфер с принятыми данными и размер.
                    угу я уже это читал про посылку сообщения.
                    извиняюсь за тупой вопрос.
                    ?: как сделать указатель на буфер в сообщении...
                    Сообщение отредактировано: v1m -
                      Цитата v1m @
                      как сделать указатель на буфер в сообщении

                      Просто приведением типов к типу параметров сообщения :)
                      ExpandedWrap disabled
                        var
                          Buff: array[0..1023] of Byte;
                          FilledOn: Integer;//насколько конкретно заполнено
                        begin
                          //заполнение буфера и конкретного размера данных
                          SendMessage(hComponent, CM_DATAREAD, Integer(@Buff), FilledOn);
                          //...
                        end;

                      или вариант с динамическим распределением буфера, освобождение в этом же коде:
                      ExpandedWrap disabled
                        var
                          pBuff: PByte;
                          DataSize: Integer;//сколько данных начитано
                        begin
                          //возможно выяснение размера данных...
                          pBuff := GetMem(<SomeValue>);//конкретный размер может быть получен по разному: либо точное значение, либо "гарантированно" достаточный размер
                          try
                            //заполнение буфера и размера данных
                            SendMessage(hComponent, CM_DATAREAD, Integer(pBuff), DataSize);
                            //...
                          finally
                            FreeMem(pBuff);
                          end;
                        end;

                      также с дин. распределением буфера, но освобождением на приемной стороне
                      ExpandedWrap disabled
                        var
                          pBuff: PByte;
                          DataSize: Integer;//сколько данных начитано
                        begin
                          //возможно выяснение размера данных...
                          pBuff := GetMem(<SomeValue>);//конкретный размер может быть получен по разному: либо точное значение, либо "гарантированно" достаточный размер
                          //заполнение буфера и размера данных
                          //если буфер выделялся с запасом, а реальных данных получено меньше, то нужно либо перераспределить его /ReallocMem/, либо передавать размер распределенный,
                          //а реальный размер полезных данных как-то дополнительно /например, в начале буфера зарезервировать несколько байт под это/
                          PostMessage(hComponent, CM_DATAREAD, Integer(pBuff), DataSize);
                          //дальше поток занимается своими делами, не ждет, память будет освобождена компонентом
                          //*thread says*: пойду выпью какао с зефиром :)
                        end;
                        сейчас попробую)
                          а как в параметрах сообщения достать этот указатель?
                            ну дык обратным приведением ж :)
                            ExpandedWrap disabled
                              var
                                pBuff: PByte;
                                DataSize: Integer;
                              begin
                                pBuff := PByte(wParam);
                                DataSize := lParam;
                              PByte это тип array of integer ? или тот который стандартно задается?
                              и еще вопрос как handle взять?
                              Сообщение отредактировано: v1m -
                                Тот который стандартно задается, но это только для примера. Ты можешь использовать любые указатели, какие тебе нравятся (только в данном не приводи к указателям дин. массивы и строки).
                                Handle должен передать сам компонент при запуске потока, удобнее всего параметром конструктора.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) 1 [2] 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0381 ]   [ 16 queries used ]   [ Generated: 1.05.24, 22:54 GMT ]