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;
我更喜欢控制台或服务应用程序。我是否需要一个(不可见的)窗口句柄+一些窗口消息队列代码来使该组件正常工作?
更新:一些(非官方)文档 http://www.fredshack.com/docs/indy.html says:
TIdUDPServer 当活动时创建一个监听线程来监听
入站 UDP 数据包。 ...当 ThreadedEvent 为 false 时,OnUDPRead
事件将在主程序线程的上下文中触发。什么时候
ThreadedEvent 为 true,则在以下上下文中触发 OnUDPRead 事件
侦听器线程。
如果您使用线程,则不需要 Windows 消息或表单。只需将 ThreadedEvent 设置为 true 并在线程中处理,请记住该事件是在不同的线程上传入的,因此您必须处理线程“同步”。我通过仅使用处理来自其自己的内部队列(我的消息和我的队列,而不是 Windows 消息或队列)的消息的线程来实现此目的,因此事件处理程序将带有接收到的数据的消息放入线程的队列中,以便在“目标”线程的上下文,而不是 Indy 侦听器线程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)