【发布时间】:2017-08-29 20:26:37
【问题描述】:
我想知道是否有可能创建一个在主线程中正在进行操作时不会冻结的动画进度指示器。我认为也许创建第二个线程并使用它来显示一个简单的对话框(在这种情况下为wxGenericProgressDialog)可以解决问题。我尝试了多种方法来做到这一点,但都失败了。有一个简单的例子:
class ThreadTester : public wxThread {
public:
ThreadTester(wxMutex *mutex, wxCondition *condition)
{
m_mutex = mutex;
m_condition = condition;
}
virtual wxThread::ExitCode Entry() override {
// This is usually non-blocking operation - this window
// is by default non-modal
d = new wxGenericProgressDialog("test1", "test2", 100, 0);
wxMutexLocker lock(*m_mutex);
m_condition->Broadcast();
return nullptr;
}
private:
wxCondition *m_condition;
wxMutex *m_mutex;
wxGenericProgressDialog *d;
};
void MyFrame::PerformSomeTimeConsumingOperation(wxCommandEvent& event)
{
wxMutex mutex;
wxCondition condition(mutex);
mutex.Lock();
auto t = new ThreadTester(&mutex, &condition);
t->Run();
// Wait until showing dialog is completed
condition.Wait();
// Perform some time-consuming operation here
// Kill thread (and hide the dialog) after the operation is completed
t->Kill();
}
当我删除那行时
d = new wxGenericProgressDialog("test1", "test2", 100, 0);
它会工作得很好。这就是为什么我开始认为使用 wxWidgets(甚至没有父级)创建任何对话框都需要主线程的某种关注。这就是为什么当主线程被阻塞时无法在任何其他线程中创建对话框的原因。那是对的吗?有没有人实现了我想做的事情?我知道这样做的推荐方法是将耗时的操作移到另一个线程并将 gui 处理放在主线程中,但由于这需要重新设计我的应用程序的某些部分,我决定试一试先这样。
【问题讨论】:
标签: c++ multithreading wxwidgets