wxwidgets:工作线程完成后如何杀死进度条?

时间:2014-10-14 15:30:18

标签: multithreading progress-bar wxwidgets

用户界面有一个按钮Start,当点击时启动一个工作线程并且该线程执行:

- starts local bluetooth radio.
- start searching for remote radios.

当工作线程正在这样做时,我想显示一个进度条。这是我的计划:

void MyFrame::OnStart(wxCommandEvent& event)
{
   /* launch worker thread */
   int count = 0;
   bool bSkip = false;
   while (1)
   {
     wxProgressBar *p_pb = new wxProgressBar(...);
     count++;
     Sleep(500);
     /* update progress bar to new value */
     p_pb->update(count, wxStringEmpty, &bSkip);

     /* need a way to get out of here when the worker thread is done */
   }
}

/* custom event, fired when bluetooth is done */
void MyFrame::OnBluetoothSearchDone(wxCommandEvent& event)
{
   /* we know the thread is done because this event is fired */
   /* get data (if any) from the bluetooth module */
}

正如您在触发工作线程后所看到的那样,主UI线程卡在进度条循环中,并且永远不会捕获工作线程发送的事件。

如果有办法检查待处理事件,那么我可以在进度条循环中执行此操作,如果有,那么我可以突破?或者可以从空闲函数调用进度条上的更新方法??

1 个答案:

答案 0 :(得分:0)

在wxWidgets中没有wxProgressBar这样的东西。如果您使用wxProgressDialog及其Update()方法,则应已调度事件,因为它在内部调用wxYield()。如果你不这样做,你可以自己做 - 但要确保你明白这样做的危险! - 或者,更好的是,完全避免进入循环,只是禁用无法使用的UI元素,并使用计时器更新进度指示器。