2011-10-04 75 views
3

Indy UDP服務器組件似乎依賴於Windows消息,因爲我看到只有當鼠標光標移動到包含服務器組件的窗體上時纔會顯示新消息。如何在控制檯應用程序中使用TIdUDPServer?

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說:當活動創建一個監聽線程監聽 入站UDP數據包

TIdUDPServer。 ...當ThreadedEvent爲false時,OnUDPRead 事件將在主程序線程的上下文中觸發。當 ThreadedEvent爲true時,會在偵聽器線程的 上下文中觸發OnUDPRead事件。

+0

這可能是有用的:http://stackoverflow.com/questions/4359635/udp-server-and-client-in-delphi –

+0

它不依賴於Windows消息。 –

回答

8

如果你使用線程,那麼你不需要Windows消息和窗體。只需將ThreadedEvent設置爲true並在線程中處理,請記住該事件正在進入另一個線程,因此您必須處理線程「同步」。我只通過使用處理自己的內部隊列中的消息的線程(我的消息和我的隊列,而不是Windows消息或隊列)來執行此操作,因此事件處理程序會將收到的數據的消息放入線程的隊列中,以便在「目標」線程的上下文,而不是Indy偵聽器線程。

+0

現在它就像一個魅力,謝謝你失蹤的一塊 – mjn

相關問題