我使用Indy 10的TIdCmdTCPServer組件來實現我的客戶機 - 服務器應用程序。問題是來自客戶端的請求可能相當複雜,並且我的服務器應用程序的GUI部分立即失去了響應能力。從Indy Documentation中,我得到了Indy:如何更改偵聽程序線程優先級
使用線程優先級tpHighest創建並啓動Bindings的偵聽器線程。
我可以改變這種行爲嗎?
我使用Indy 10的TIdCmdTCPServer組件來實現我的客戶機 - 服務器應用程序。問題是來自客戶端的請求可能相當複雜,並且我的服務器應用程序的GUI部分立即失去了響應能力。從Indy Documentation中,我得到了Indy:如何更改偵聽程序線程優先級
使用線程優先級tpHighest創建並啓動Bindings的偵聽器線程。
我可以改變這種行爲嗎?
正如Rob指出的那樣,不要改變監聽線程的優先級,而應該降低工作線程的優先級。它可以在的onConnect()處理程序TIdCmdTCPServer實例的訪問,就像這樣:
procedure TServerForm.IdCmdTCPServer1Connect(AContext: TIdContext);
begin
// sanity checks need to go here
TIdYarnOfThread(AContext.Yarn).Thread.Priority := tpLower;
end;
設置監聽線程的優先級不會解決您的問題。所有的監聽線程都在監聽,這不是一個CPU密集型任務。在連接到達之前,該線程根本沒有做任何事情。您可以使用Process Explorer等工具來確認;我認爲它可以顯示線程的CPU使用率。
設置優先級低實際上可能使你的服務器出現少響應,因爲當一個連接到達時,線程監聽這一方面將優先級較低的運行,將不能夠連接上立即開展工作。在服務器開始處理請求之前,客戶端必須等待一會兒。
請求不在監聽線程中處理。偵聽器線程將大部分工作委託給其他線程。如果你只有一個TCP綁定,那麼你將只有一個偵聽器線程,但是你可以處理許多併發連接。儘管只有一個偵聽器,每個連接都將由單獨的線程處理。
無論如何,您可以通過處理服務器對象的OnBeforeListenerRun
事件來更改優先級。它接收到代表監聽器線程的TIdThread
的引用,因此您可以爲其Priority
屬性分配不同的值。此外,您有源代碼,因此您可以進入並更改IdGlobalCore.pas中常數tpListener
的定義。代碼直接使用該值,而不是tpHighest
。
嗨!好的,我必須更清楚:服務器有一個小的GUI部分,應該保持響應。所以我想要的(感謝指出,順便說一句)是降低線程的響應客戶端請求創建的優先級...任何可以做到這一點? – jpfollenius 2009-02-26 19:26:10
這看起來完全像我在找的東西。我必須等到明天,直到我能夠測試它。我會在這裏留言。不管怎麼說,還是要謝謝你! – jpfollenius 2009-02-26 21:01:59