2011-05-20 33 views
6

我實現在C#中一個非常基本的線索:線程得到100%的CPU速度非常快

private Thread listenThread; 

public void startParser() 
{ 
    this.listenThread = new Thread(new ThreadStart(checkingData)); 
    this.listenThread.IsBackground = true; 
    this.listenThread.Start(); 
} 

private void checkingData() 
{ 
    while (true) 
    { 

    } 

}

然後我立刻得到100%的CPU。我想檢查傳感器數據是否在while(true)循環內被讀取。爲什麼它是這樣的?

在此先感謝。

+0

我們可以假設''while'循環中實際上有一些實現,它有一定的終止能力嗎? – Yuck 2011-05-20 00:12:31

+1

根據此代碼獲得100%的CPU是正確的。有沒有想要檢查傳感器數據的間隔?可能你可能需要相應地睡覺線程。 – CharithJ 2011-05-20 00:14:47

回答

12

while (true)是什麼殺死你的CPU。

您可以添加Thread.Sleep(X)給您,同時在再次檢查之前給CPU一些休息。

此外,似乎你實際上需要一個計時器。

看看這裏的Timer類之一http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx

使用定時器的拉動間隔,你可以承受,1秒,半秒。
您需要在CPU使用率和檢查之間可承受的最大延遲之間進行權衡。

+0

嗨。謝謝。但是,我該如何等待數據傳入?我想不斷檢查數據。 – olidev 2011-05-20 00:13:31

+1

你需要多久檢查一次?即使讓它睡10ms也會產生巨大的影響。 – 2011-05-20 00:16:10

+0

@JoesyXHN - 你的數據來自哪裏? – 2011-05-20 00:16:22

2

讓你的循環。它四處亂跑,並且變得疲倦。至少,最終讓中斷

+0

我應該使用:timer.tick每1毫秒,而不是使用線程while循環和睡眠1毫秒? – olidev 2011-05-20 00:14:38

+0

BAHAHAHAHAHAHAHA! 1毫秒!嘗試100-500毫秒。 – 2011-05-20 00:29:58

0

你可以使用阻塞隊列。從阻塞隊列中取出一個項目將阻塞該線程,直到有一個項目放入隊列。這不會花費任何CPU。

與.NET4,您可以使用BlockingCollection http://msdn.microsoft.com/en-us/library/dd267312.aspx

下4版,有沒有阻塞隊列INT .NET框架。

你可以找到許多阻塞隊列的工具,如果你谷歌它。

這裏是通過的方式實現

http://www.codeproject.com/KB/recipes/boundedblockingqueue.aspx

。你等待的數據來自哪裏?

編輯,如果你想檢查文件

。您可以使用FileSystemWatcher通過線程塊檢查它。

如果您的數據來自外部API並且api不會阻塞該線程,那麼除了使用Thread之外,無法阻止該線程。睡眠

+0

如果JoesyXHN需要檢查文件或外部API或其他內容,阻止收集會有幫助嗎? – 2011-05-20 00:30:37

+0

你是對的。如果他想看一個文件或數據來自外部API。阻止收集是沒用的。 – 2011-05-20 00:44:04

+0

所以我問他數據來自哪裏。 – 2011-05-20 00:45:14

1

因爲你的函數是不是在做,而塊內的任何東西,它抓住了CPU,並且對於所有的實際目的,不會放手吧,所以其他線程可以做他們的工作

private void checkingData() 
{ 
    while (true) 
    { 
     // executes, immediately 
    } 
} 

如果您將其更改爲以下,你應該會看到更合理的CPU消耗:

private void checkingData() 
{ 
    while (true) 
    { 
     // read your sensor data 

     Thread.Sleep(1000); 
    } 
} 
+0

請不要做微不足道的修改只是爲了阻止你的帖子。鼓勵編輯,但請做出實際的改進。謝謝! – 2011-07-13 22:27:32

0

如果你輪詢的條件,絕對不爲其他人則建議,把睡眠。我還補充說,如果您需要最佳性能,您可以使用統計技巧避免在讀取傳感器數據時進行睡眠。當您檢測到傳感器數據處於空閒狀態時,例如說,連續10次,然後再次開始每次迭代休眠。

相關問題