2013-07-25 89 views
2

閱讀了這個問題: Delphi Windows Service Design,我看到大部分的設計師在TServiceOnExecuteTThread方法如下使用此代碼,以保持服務活着。德爾福服務聽TCP或UDP

while not Terminated do 
begin 
    // do something 
end; 

但是,如果我需要(和我一樣)來創建一個服務(使用印),以便發回一些認證數據由主應用程序發送的消息做出反應,我該怎麼辦這個代碼是什麼,忽略它還是放一些Sleep()呢?

+2

你並不需要實現'TService'類的'OnExecute'事件的方法。這是可選的。 – TLama

+4

TLama是對的。最好不要使用OnExecute事件。您應該將該邏輯移動到一個單獨的工作線程,該線程在'OnStart'事件中啓動,並在'OnStop'事件中終止。如果'OnExecute'完全不分配,'TService'會爲您SCM請求做出響應。但是,如果'OnExecute'分配,你有責任()'手動調用'ServiceThread.ProcessRequests和服務將停止本身時候'OnExecute'退出。 –

回答

7

Indy的TIdTCPServerTIdUDPServer組件是多線程的,所以您根本不需要使用TService.OnExecute事件。你可以只激活它們TService.OnStart事件,並在TService.OnStop事件禁用它們,然後根據需要分配處理器的TIdTCPServer.OnExecuteTIdUDPServer.OnUDPRead事件。這兩起事件已經對循環你,所以你不需要在他們while not Terminated循環。只需根據需要讀取/處理一個請求,然後退出,然後等待下一個事件重複。讓服務器處理引發的任何異常。而且要記住,TIdUDPServerThreadedEvent屬性,默認爲false,所以你應該把它設置爲True一個服務裏面。

+0

我應該使用UDPRead上的'AThread:TIdUDPListenerThread;'指向另一個函數來啓動,而不是在UDPRead內編碼嗎?有什麼不同? – PSyLoCKe

+0

我不明白你在問什麼。 'AThread'參數只是指定哪個內部線程正在接收數據。它主要僅用於訪問'TIdUDPListenerThread.Server'和'TIdUDPListenerThread.Data'屬性。 'ABinding'參數指定接收數據的'TIdUDPServer.Binding'套接字,因此您可以從中獲取對等信息,並將回覆發回到同一套接字上。無論您是直接在OnUDPRead事件處理程序中編寫邏輯還是委託給其他函數,都取決於您。 –