我想知道是否可以創建一個動畫進度指示器,該指示器在主線程中正在進行操作時不會被凍結。我認爲可能創建第二個線程並使用它來顯示一個簡單的對話框(在這種情況下爲wxGenericProgressDialog
)可以解決問題。我嘗試了多種方法,但都失敗了。有一個簡單的例子:在使用wxWidgets的另一個線程中顯示進度指示器
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處理放在主線程中,但由於這需要重新設計應用程序的某些部分,所以我決定試一試這種方式首先。