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;
我更喜欢控制台或服务应用程序。我是否需要一个(不可见的)窗口句柄+一些Windows消息队列代码来使这个组件工作?
更新:一些(非正式的)documentation说:
TIdUDPServer在激活时创建一个侦听线程来侦听 入站UDP数据包。 ...当ThreadedEvent为假时,OnUDPRead 将在主程序线程的上下文中触发事件。什么时候 ThreadedEvent是真的,OnUDPRead事件是在上下文中触发的 听众线程。
答案 0 :(得分:8)
如果使用线程,则不需要Windows消息或表单。只需将ThreadedEvent设置为true并在线程中处理,记住事件是在另一个线程上进行的,因此您必须处理线程“同步”。我这样做只是使用线程处理消息从他们自己的内部队列(我的消息和我的队列,而不是Windows消息或队列),所以事件处理程序将带有接收数据的消息放入线程的队列中,以便在“目标”线程的上下文,而不是Indy侦听器线程。