2016-05-05 45 views
6

我正在創建一個在多個服務器上發送和接收數據的機制。服務器在Windows上運行,並使用Delphi 7。如何在Delphi多線程中避免使用100%的CPU?

發送數據在幾個併發線程中形成,不可能知道哪個線程將首先形成數據。將數據添加到緩衝區的時刻由CriticalSection同步。發送線程不斷檢查是否有任何新的數據要發送。通過這樣做,每個線程吃1個CPU核心。這種方式運行速度非常快,但即使服務器不發送數據,CPU也是100%左右。我需要多個線程,我需要避免這種高CPU使用率。

我已經嘗試了兩種選擇:

  1. 睡眠 - 如果在緩衝區中沒有數據我跑睡眠(1)。 CPU內核沒有加載,但對新數據的反應速度約爲100倍。這不是一個解決方案。

  2. 殺死和創建線程。如果緩衝區中沒有數據,我殺死線程。添加數據的函數將創建一個新線程。新線程將發送數據,釋放緩衝區並再次被殺死。 CPU負載減少,但創建和查殺需要太多時間。結果是速度降低了100倍。

有沒有其他的睡眠方式(1)沒有消耗100%CPU並且反應迅速?或者是否有可能在發生某些事件之前暫停線程?

問題得到解答。這適用於我https://stackoverflow.com/a/4401519/4052208

+1

見這樣的:HTTP://計算器。 com/questions/4401171 /自我暫停-delphi-thread-in-delphi-when-its-not-need-and-safe-resuming –

+2

您是否嘗試過使用OmniThreadLibrary - http://otl.17slon.com/? – RBA

+5

沒有你的線程檢查 - 添加工作時通知他們。線程可以等待像TEvent這樣的同步對象 - 當工作被添加到隊列中時,您可以獲取可用線程併發信號通知它開始工作。像OTL這樣的圖書館如果不需要任何足夠重新發明輪子的特殊功能,就可以實現這種類型的功能。 –

回答

9

您可能會讓線程等待WaitFor*函數的數據。他們不會吃處理器資源。

我建議使用WaitForMultipleOjects,它有可能等待一些事件。例如,主事件(尋找CreateEvent或Delphi包裝類TEvent)應當由數據產生器被設置時緩衝區中數據,和另一事件服務線程終止:

//Execute body 
repeat 
    WaitRes := WaitForMultipleObjects(2, @FEventHandles, False, CONST_TIMEOUT); // or INFINITE 
    if WaitRes = WAIT_OBJECT_0 + 1 then // event from data producer 
    GetDataFromBuffer(); 

until WaitRes = WAIT_OBJECT_0; // external event for thread stop 
相關問題