这是一个 Visual Studio Express C++ Windows 窗体应用程序。
我想在 WAV play wavPlayer 中播放一个 WAV 文件 strFileName.WAV,从按下“开始”按钮到按下“停止”按钮,每 10 秒播放一次。
当每 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();
}
最佳答案
去掉
while (lblRunning->Text == L"Running") {
Application::DoEvents();
}
循环。当您从 bntStart_Click
返回时,表单将返回到发送消息并且计时器将按预期计时。您无需创建手动 Application::DoEvents()
循环,这可能是您出现问题的原因。
通过在循环中调用 Application::DoEvents();
,您正在为窗口消息创建池循环。如果没有任何 sleep 调用,此循环会导致 100% 的 CPU 使用率。通过让您的 bntStart_Click
返回,WinForms 运行时将使您的进程休眠,直到消息准备就绪 - 从而导致非常低的 CPU 使用率。
如此高的 CPU 使用率可能导致您的应用程序无响应,这就是点击似乎未被处理的原因。
关于c++ - 如何停止 C++ 中的应用程序 DoEvents 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11382844/