c++ - 如何停止 C++ 中的应用程序 DoEvents 循环?

标签 c++

这是一个 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/

相关文章:

c++ - CXXTEST 编译器是否有#define _KEYWORD_ 来排除代码块?

c++ - 全局变量中的动态内存分配错误

android - 将 SDL C++ 应用程序交叉编译到 Android

c++ - 如何将指针 vector 转换为 C++ 中的链表?

c++ - 哪些类应该既不可复制又不可移动?

c++ - 如何判断 bjam 正在使用哪些优化来构建 boost

c++ - 如果使用嵌套命名空间,如何转发声明 C++ 结构?

c++ - 如何在 Qt 中打印 QWidget?

c++ - 调试类,C++,链接器错误

c++ - Espeak 功能