2012-07-08 23 views
1

這是一個Visual Studio Express C++ Windows窗體應用程序。如何在C++中停止應用程序DoEvents循環?

我想在按下「開始」按鈕之前每隔10秒在WAV播放wavPlayer中播放一個WAV文件strFileName.WAV,直到按下「停止」按鈕爲止。

當每隔10秒的時間間隔結束時,TimerEventProcessor播放WAV文件。

問題是我必須按「停止」兩次才能使其工作。第一次按「停止」似乎被忽略。

爲什麼btnStop_Click在第一次按「停止」時沒有執行?

private: System::Void bntStart_Click(System::Object^ sender, System::EventArgs^ e) { 
    if (String::IsNullOrEmpty(strFileName)) { 
    lblRunning->Text = L"Cannot Start Until File Is Loaded"; 
    } 
    else { 
    lblRunning->Text = L"Running"; 
    myTimer->Interval = iIntervalSeconds * 1000; 
    myTimer->Tick += gcnew EventHandler(TimerEventProcessor); 
    myTimer->Enabled = true; 
    while (lblRunning->Text == L"Running") { 
     Application::DoEvents(); 
    } 
    } 
} 

private: System::Void btnStop_Click(System::Object^ sender, System::EventArgs^ e) { 
    lblRunning->Text = L"Stopped"; 
    myTimer->Enabled = false; 
    wavPlayer->Stop(); 
} 
+1

不要使用'DoEvents'!這基本上是一個設計錯誤,僅包含向後兼容VB6,並且它不適用於表單在內部運行的方式。這是一個永遠不應該存在的黑客(但VB6不支持線程,因此它是需要的)。 – 2012-07-08 12:11:07

回答

3

擺脫

while (lblRunning->Text == L"Running") { 
    Application::DoEvents(); 
} 

循環。當您從bntStart_Click返回時,表單將返回到分派消息,計時器將按預期方式打勾。您不需要創建一個手動Application::DoEvents()循環,這可能是您的問題的原因。

通過在循環中調用Application::DoEvents();您正在爲窗口消息創建池循環。如果沒有任何睡眠呼叫,此循環會導致100%的CPU使用率通過讓您的bntStart_Click返回,WinForms運行時將使您的進程進入休眠狀態,直到消息準備就緒 - 這會導致CPU使用率非常低。

這麼高的CPU使用率可能會導致您的應用程序無法響應,這就是爲什麼它似乎沒有處理點擊。

+0

它的工作原理!謝謝,shf301! – nyanagharo 2012-07-08 12:01:26