当我在 ActiveXForm 上使用TIdUDPServer时,Udp服务器的OnUDPRead事件不会触发。
如果我检查IdUDPServer.Active状态,那么" true"。但为什么OnUDPRead从未触发?
答案 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
处理程序代码编写为线程安全的。