2009-02-26 79 views
2

我使用Indy 10的TIdCmdTCPServer組件來實現我的客戶機 - 服務器應用程序。問題是來自客戶端的請求可能相當複雜,並且我的服務器應用程序的GUI部分立即失去了響應能力。從Indy Documentation中,我得到了Indy:如何更改偵聽程序線程優先級

使用線程優先級tpHighest創建並啓動Bindings的偵聽器線程。

我可以改變這種行爲嗎?

回答

5

正如Rob指出的那樣,不要改變監聽線程的優先級,而應該降低工作線程的優先級。它可以在的onConnect()處理程序TIdCmdTCPServer實例的訪問,就像這樣:

procedure TServerForm.IdCmdTCPServer1Connect(AContext: TIdContext); 
begin 
    // sanity checks need to go here 
    TIdYarnOfThread(AContext.Yarn).Thread.Priority := tpLower; 
end; 
+0

這看起來完全像我在找的東西。我必須等到明天,直到我能夠測試它。我會在這裏留言。不管怎麼說,還是要謝謝你! – jpfollenius 2009-02-26 21:01:59

6

設置監聽線程的優先級不會解決您的問題。所有的監聽線程都在監聽,這不是一個CPU密集型任務。在連接到達之前,該線程根本沒有做任何事情。您可以使用Process Explorer等工具來確認;我認爲它可以顯示線程的CPU使用率。

設置優先級低實際上可能使你的服務器出現響應,因爲當一個連接到達時,線程監聽這一方面將優先級較低的運行,將不能夠連接上立即開展工作。在服務器開始處理請求之前,客戶端必須等待一會兒。

請求不在監聽線程中處理。偵聽器線程將大部分工作委託給其他線程。如果你只有一個TCP綁定,那麼你將只有一個偵聽器線程,但是你可以處理許多併發連接。儘管只有一個偵聽器,每個連接都將由單獨的線程處理。

無論如何,您可以通過處理服務器對象的OnBeforeListenerRun事件來更改優先級。它接收到代表監聽器線程的TIdThread的引用,因此您可以爲其Priority屬性分配不同的值。此外,您有源代碼,因此您可以進入並更改IdGlobalCore.pas中常數tpListener的定義。代碼直接使用該值,而不是tpHighest

+0

嗨!好的,我必須更清楚:服務器有一個小的GUI部分,應該保持響應。所以我想要的(感謝指出,順便說一句)是降低線程的響應客戶端請求創建的優先級...任何可以做到這一點? – jpfollenius 2009-02-26 19:26:10