ActiveX窗体上的Udp服务器

时间:2015-02-11 11:00:20

标签: delphi activex indy

当我在 ActiveXForm 上使用TIdUDPServer时,Udp服务器的OnUDPRead事件不会触发。
如果我检查IdUDPServer.Active状态,那么" true"。但为什么OnUDPRead从未触发?

1 个答案:

答案 0 :(得分:1)

TIdUDPServer是一个多线程组件。其Bindings集合中的每个项目都在其自己的工作线程中侦听数据。

默认情况下TIdUDPServer.ThreadedEvent属性为false,这意味着每个Binding都会在主UI线程的上下文中通过调用OnUDPRead来触发TThread.Synchronize()事件。除非DLL和EXE都是在启用运行时软件包的情况下编译的,否则它们将在DLL内部工作,因此它们共享RTL的公共副本。否则,DLL将拥有自己独立的RTL副本而不是主EXE的RTL(假设EXE完全使用VCL)。如果未启用运行时软件包,主EXE必须定期显式调用DLL以为Synchronize()请求提取DLL的消息队列,因为它们不会出现在EXE的消息队列中(假设EXE甚至知道如何处理它们。)

如果将ThreadedEvent设置为true,则不会使用Synchronize(),因此将在每个OnUDPRead线程的上下文中触发Binding事件。您只需要确保将OnUDPRead处理程序代码编写为线程安全的。