2017-08-29 26 views
0

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

回答

1

你應該切換你的方法 - 在輔助線程上執行一個長時間運行的任務,並在主體中執行GUI更新/刷新。

您對問題的看法是錯誤的 - 線程明確存在以解決此問題 - 在主線程運行時執行長時間運行的任務。此外 - 你的方法並不能保證在wxWidgets支持的3個主要平臺的任何一個上工作。底線 - 在線程中執行任務併發送通知事件以更新主要的GUI - GUI。

相關問題