如何在C++中停止ApplicationDoEvents循环

How do I stop an Application DoEvents loop in C++?

本文关键字:ApplicationDoEvents 循环 C++      更新时间:2023-10-16

这是一个Visual Studio速成版C++Windows窗体应用程序。

我想从按下"开始"按钮到按下"停止"按钮,每隔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();
}

清除

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

循环。当您从bntStart_Click返回时,表单将返回到调度消息,计时器将按预期滴答作响。您不需要创建手动Application::DoEvents()循环,这可能是您的问题的原因。

通过在循环中调用Application::DoEvents();,您正在为窗口消息创建一个池化循环。在没有任何睡眠调用的情况下,此循环会导致100%的CPU使用率。通过让bntStart_Click返回,WinForms运行时将休眠进程,直到消息准备就绪,从而导致CPU使用率非常低。

这种高CPU使用率可能会使您的应用程序没有响应,这就是为什么点击似乎没有得到处理的原因。

相关文章:
  • 没有找到相关文章