2011-01-27 158 views
0

下面的代碼部分有什麼問題?有任何想法嗎?我通過串口發送命令到我的設備。在每個命令之後,設備將爲這個命令工作,然後另一個命令爲它而來,並繼續如此。c#睡眠線程問題

在按鈕的Click事件

{ 
    function1(); 
    Thread.Sleep(5000); 
    function2(); 
    Thread.Sleep(5000); 
    function3(); 
} 

我想通了,如果我從代碼擦除第二睡眠和功能3像下面

,它都二元函數,但如果我想繼續像現在這樣,沒有做第三個。

在按鈕的Click事件

{ 
    function1(); 
    Thread.Sleep(5000); 
    function2(); 
} 

作品...... 謝謝

+3

這個問題很難理解,因爲在發佈的代碼中沒有嚴格的問題(儘管通常比`Sleep`更好的機制)。這聽起來像是串口設備的問題,但你並沒有真正清楚發生什麼情況和你期望發生的事情。不確定任何人都可以僅根據當前信息回答這個問題。 – 2011-01-27 07:17:11

+0

`代碼中存在什麼問題?請提供一個自包含的程序來展示您的問題。 – 2011-01-27 07:17:53

+0

其實我的方案是通過串口配置我的設備。爲此我需要發送命令到我的設備。例如,首先我發送第一個命令「fdisk」。我的設備接受此命令並執行。然後我應該發送第二個命令並等待設備執行它然後發送第三個。而我的問題是睡覺線程不適合我。 Thread.Sleep(n); – 2011-01-27 07:23:56

回答

5

你阻塞UI線程。 不要這樣做。這意味着您的用戶界面無法自行更新。相反,設置一個System.Windows.Forms.Timer在5秒鐘內觸發下一個要調用的函數。或者,在完全不同的線程中完成所有這些操作(可能使用Sleep,可能使用另一種定時器在線程池線程上觸發),並在需要更新UI本身時使用Control.Invoke/BeginInvoke收回UI線程。

編輯:鑑於你的「答案」,似乎屏蔽UI線程只是其中一個問題 - 並且讓設備正確響應是一個更大的問題。你不應該只依靠睡覺一段時間。您應該檢測設備何時完成前一個命令。這是可能,它沒有給出任何反饋,但這將是可怕的糟糕設計。如果可能的話,研究如何從設備讀取關於何時完成的反饋(例如,從串口讀取!),並且只在前一個命令完成時纔開始下一個命令。根據您接收反饋的方式,您可以在非UI線程上使用阻塞調用,或者使用異步模型來觸發事件。

0

由於代碼被呈現在那裏,它沒有任何問題。它將:

  • 執行功能1
  • 睡眠5秒
  • 執行功能2
  • 睡眠5秒
  • 執行功能3

然而,因爲這是在GUI事件它會在此過程中凍結應用程序。請考慮將執行轉換爲線程。

在.NET 4.0中:

Task.Factory.StartNew(() => sendData());

在所有的.NET版本:

System.Threading.Thread myThread = new System.Threading.Thread(sendData); 
myThread.IsBackground = true; 
myThread.Start();

然後你有你的SendData方法:

private void sendData() 
{ 
    function1(); 
    Thread.Sleep(5000); 
    function2(); 
    Thread.Sleep(5000); 
    function3(); 
} 

如果你真的需要做的在GUI線程中的東西,你可以通過定期調用Application.DoEvents();來使它更響應,但這不是一種好方法解決它。

還要記住,你不能從其他線程訪問GUI。有關如何從其他線程調用GUI線程的示例代碼,請參閱http://kristofverbiest.blogspot.com/2007/02/simple-pattern-to-invoke-gui-from.html

0

BackgroundWorker可能是解決UI阻塞的解決方案。

擺脫睡覺如果函數創建自己的線程,給它們回調方法,在第一個完成後觸發下一個函數。

-1

謝謝你們。我解決它。問題是我沒有讓線程睡得足夠。 5000毫秒對於第二個命令不夠。