如何在控制台应用程序中使用TIdUDPServer?

3
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为false时,在主程序线程的上下文中触发OnUDPRead事件。当ThreadedEvent为true时,在监听器线程的上下文中触发OnUDPRead事件。

这可能会有用:https://dev59.com/21LTa4cB1Zd3GeqPaWoE - Ken White
它不依赖于Windows消息。 - Premature Optimization
1个回答

9
如果您使用线程,则不需要Windows消息或表单。只需将ThreadedEvent设置为true并在线程中处理,记住事件是在不同的线程中发生的,因此您必须处理线程“同步”。我通过仅使用处理其自己内部队列(我的消息和我的队列,而不是Windows消息或队列)的线程来实现此目的,因此事件处理程序将接收到的数据放入线程的队列中,以在“目标”线程的上下文中处理,而不是Indy侦听器线程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接