Indy UDP服务器组件似乎依赖于Windows消息,因为我看到只有当鼠标光标移动到包含服务器组件的表单时才会出现新消息.
我使用以下代码在运行时创建了组件:
private
{ Private declarations }
Srv: TIdUDPServer;
...
procedure TForm1.FormCreate(Sender: TObject);
begin
Srv := TIdUDPServer.Create(Self);
Srv.DefaultPort := 9009;
Srv.OnUDPRead := Self.udpServerUDPRead;
Srv.Active := True;
end;
Run Code Online (Sandbox Code Playgroud)
我更喜欢控制台或服务应用程序.我是否需要一个(不可见的)窗口句柄+一些Windows消息队列代码来使这个组件工作?
更新:一些(非官方的)文档说:
TIdUDPServer在活动时创建侦听线程以侦听入站UDP数据包....当ThreadedEvent为false时,将在主程序线程的上下文中触发OnUDPRead事件.当ThreadedEvent为true时,将在侦听器线程的上下文中触发OnUDPRead事件.
如果使用线程,则不需要Windows消息或表单.只需将ThreadedEvent设置为true并在线程中处理,记住事件是在另一个线程上进行的,因此您必须处理线程"同步".我这样做只是使用线程处理消息从他们自己的内部队列(我的消息和我的队列,而不是Windows消息或队列),所以事件处理程序将带有接收数据的消息放入线程的队列中,以便在"目标"线程的上下文,而不是Indy侦听器线程.