1

这是一个 Visual Studio Express 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();
}
4

1 回答 1

3

摆脱

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

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

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

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

于 2012-07-08T11:43:22.460 回答