2012-12-13 58 views
1

基本上,標題所說的內容。我想在用戶按下該特定按鈕時更新每1秒包含一個按鈕的文本。我注意到,當程序沒有焦點時,它的工作正常,文本正確刷新,但當我在程序上盤旋時,或者當我嘗試點擊它的菜單時,Windows通知我該程序沒有響應,並詢問我是否我想要它終止。當循環結束時程序返回到正常狀態。還有我可能做的任何動作(如移動它或關閉它),而它是休眠() -ing在循環後執行。以下是一段代碼:Win32中的Sleep()使程序無響應

case ID_BUTTON_START: 
// Code executed when pressing Start Button. 
char startButtonText[30]; // Storing next loop text 
for (int i=5; i>0; i--) 
    { 
     sprintf(startButtonText, "Starting in ... %d", i); 
     SendMessage(hwndButtonStart, WM_SETTEXT, 0, (LPARAM)(startButtonText)); 
     Sleep(1000); 
    } 

這是正常的嗎?如果不是這是什麼原因造成的?

+0

SendMessage後睡眠?你有沒有打算使用PostMessage? – Chubsdad

+4

'睡眠()'是幾乎沒有問題的解決方案 –

回答

8

WndProc不會在應用程序內異步處理消息,這意味着所有消息都將被快速處理並立即傳遞返回值。您不能在UI線程中使用Sleep,因爲它會阻止處理其他UI事件。應該在工作線程中執行任何可能需要很長時間的繁重工作或同步請求/作業。至少有三種可行的選項:

  1. 爲該任務創建一個新的(worker thread)。
  2. 如果任務可能經常進行,請改用thread pool
  3. 設置並訂閱timer events
+0

你的第一個2個句子爲我解決了這個問題。非常感謝你。 +1並被接受。 –

0

我認爲Sleep()的呼叫可能會阻止您從WndProc返回,所以您的應用程序不會在5秒內處理髮生的事件。我建議你嘗試在1s,2s,...,5s中訂閱5個計時器事件。就像收到計時器消息時一樣,按鈕文本必須改變。我不知道如何做到這一點,我的頭頂。