ActiveX 窗体上的 Udp 服务器
Udp Server on ActiveX Form
当我在 ActiveXForm 上使用 TIdUDPServer 时,Udp 服务器的 OnUDPRead 事件没有触发。
如果我检查 IdUDPServer.Active 状态,它是 "true"。但为什么 OnUDPRead 从未触发?
TIdUDPServer
是多线程组件。 Bindings
集合中的每一项都在自己的工作线程中侦听数据。
TIdUDPServer.ThreadedEvent
属性 默认为 false,这意味着每个 Binding
都会在主 UI 线程的上下文中触发 OnUDPRead
事件调用 TThread.Synchronize()
,它在 DLL 内部不起作用,除非 DLL 和 EXE 都在启用运行时包的情况下编译,因此它们共享 RTL 的公共副本。否则,DLL 将拥有自己的 RTL 副本而不是主 EXE 的 RTL(假设 EXE 完全使用 VCL)。如果没有启用运行时包,主 EXE 将不得不定期显式调用 DLL 来为 Synchronize()
请求抽取 DLL 的消息队列,因为它们不会出现在 EXE 的消息队列中(假设 EXE 甚至知道如何如果他们这样做了,请处理它们)。
如果将 ThreadedEvent
设置为 true,将不会使用 Synchronize()
,因此 OnUDPRead
事件将在每个 Binding
线程的上下文中触发。您只需要确保您的 OnUDPRead
处理程序代码被编写为线程安全的。
当我在 ActiveXForm 上使用 TIdUDPServer 时,Udp 服务器的 OnUDPRead 事件没有触发。
如果我检查 IdUDPServer.Active 状态,它是 "true"。但为什么 OnUDPRead 从未触发?
TIdUDPServer
是多线程组件。 Bindings
集合中的每一项都在自己的工作线程中侦听数据。
TIdUDPServer.ThreadedEvent
属性 默认为 false,这意味着每个 Binding
都会在主 UI 线程的上下文中触发 OnUDPRead
事件调用 TThread.Synchronize()
,它在 DLL 内部不起作用,除非 DLL 和 EXE 都在启用运行时包的情况下编译,因此它们共享 RTL 的公共副本。否则,DLL 将拥有自己的 RTL 副本而不是主 EXE 的 RTL(假设 EXE 完全使用 VCL)。如果没有启用运行时包,主 EXE 将不得不定期显式调用 DLL 来为 Synchronize()
请求抽取 DLL 的消息队列,因为它们不会出现在 EXE 的消息队列中(假设 EXE 甚至知道如何如果他们这样做了,请处理它们)。
如果将 ThreadedEvent
设置为 true,将不会使用 Synchronize()
,因此 OnUDPRead
事件将在每个 Binding
线程的上下文中触发。您只需要确保您的 OnUDPRead
处理程序代码被编写为线程安全的。