用户界面有一个按钮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线程卡在进度条循环中,并且永远不会捕获工作线程发送的事件。
如果有办法检查待处理事件,那么我可以在进度条循环中执行此操作,如果有,那么我可以突破?或者可以从空闲函数调用进度条上的更新方法??
答案 0 :(得分:0)
在wxWidgets中没有wxProgressBar
这样的东西。如果您使用wxProgressDialog
及其Update()
方法,则应已调度事件,因为它在内部调用wxYield()
。如果你不这样做,你可以自己做 - 但要确保你明白这样做的危险! - 或者,更好的是,完全避免进入循环,只是禁用无法使用的UI元素,并使用计时器更新进度指示器。