【问题标题】:How can I use TIdUDPServer in a console application?如何在控制台应用程序中使用 TIdUDPServer?
【发布时间】:2011-10-05 05:56:41
【问题描述】:

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 事件在上下文中触发 侦听器线程。

【问题讨论】:

标签: delphi udp indy


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2010-11-05
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多