2009-07-15 97 views
0

我的應用程序是一個多線程應用程序(使用wxThreads)。目前,主線程及其子工作線程正在向Stdout輸出各種消息(使用cout)。C++ WxWidgets:通過多個線程將Stdout重定向到wxTextCtrl

我有一個新的框架/窗口與wxTextCtrl,並希望重定向到它的所有StdOut消息。

 
GuiLogFrame   *logframe; 

logframe = new GuiLogFrame(NULL, wxID_ANY, wxEmptyString); 
logframe->Show(); 

logredirector = new wxStreamToTextRedirector(logframe->get_log_textctrl()); 

這是行不通的。但是,如果我取代的最後一行

的標準輸出將被重定向到邏輯框架wxTextCtrl只要再導向的範圍是......我希望它留下來,即使它超出範圍。

我想要的是wxStreamToTextRedirector在應用程序運行的整個過程中保持不動...所以即使新線程的cout也會重定向到相同的wxTextCtrl。

有什麼想法?

回答

1

有一點非常重要,要知道的是GUI操作只應在主線程上完成;如果你不這樣做,當你有多個GUI操作同時發生時,它會崩潰或鎖定。這在Windows下是絕對正確的,但我相信它適用於所有平臺。你需要做的是使用GetEventHandler() - > AddPendingEvent向控件發佈一個事件。然後wx將事件添加到對象的隊列中,當主線程運行時,它可以執行GUI操作。

這可能不是問題的確切答案,但它是相關信息。

0

我找到了一種方法,但我沒有在多線程應用程序中嘗試過。

您可以使用new在構造函數()上創建指向wxStreamToTextRedirector的指針。 然後,不要忘記刪除析構函數中的指針。

0

wxStreamToTextRedirector是一個RAII類,它將ctor中的流與文本控件相關聯,並打破了它的dtor中的關聯。當然,您可以在堆上創建它,而不是將其用作局部變量,或者甚至只是手動執行它的Ctor/Dtor所做的操作,即在稍後時間調用ostr.rdbuf(text)並恢復原始值rdbuf()

但是,正如arolson101寫道,如果您允許多個線程使用相同的wxTextCtrl,並且簡單的重定向不會幫助您解決這個問題,那麼您的代碼仍然可能存在問題。您需要編寫自己的自定義streambuf派生類,它可以避免立即輸出文本,但會向主GUI線程發出消息,要求它執行此操作,這並非完全無關緊要。