2015-02-11 2 views
0

Когда я использую TIdUDPServer по адресу ActiveXForm, событие OnUDPRead сервера Udp не запускается.
Если я проверяю статус IdUDPServer.Active, это «true». Но почему OnUDPRead никогда не срабатывал?Udp Server в форме ActiveX

ответ

0

TIdUDPServer - многопоточный компонент. Каждый элемент в своей коллекции Bindings прослушивает данные в своем рабочем потоке.

Свойства TIdUDPServer.ThreadedEvent ложно по умолчанию, что означает, что каждый Binding вызывает OnUDPRead события в контексте главного потока пользовательского интерфейса путем вызова TThread.Synchronize(), который не работает внутри DLL, если как DLL и EXE не компилируются с временем выполнения пакетов поэтому они имеют общую копию RTL. В противном случае DLL будет иметь свою собственную отдельную копию RTL, чем RTL основного EXE (при условии, что EXE использует VCL вообще). Если не включены пакеты Runtime Packages, основной EXE должен будет явным образом вызывать в DLL периодическую пересылку очереди сообщений DLL для запросов Synchronize(), поскольку они не будут отображаться в очереди сообщений EXE (если EXE будет даже знать, как обрабатывать их, если они сделал).

Если вы установили ThreadedEvent истину, Synchronize() не будет использоваться, таким образом OnUDPRead событие будет срабатывать в контексте каждой Binding нити. Вам просто нужно убедиться, что ваш код обработчика OnUDPRead написан как потокобезопасный.

+0

благодарит за вашу помощь. Связанный [вопрос] (http://stackoverflow.com/questions/7935870/delphi-thread-not-executing-in-activex-form-but-does- в другом месте). возможно, это помогает кому-то ... – SimaWB