Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;WxWidgets:跨多个线程将Stdout重定向到wxtxtCtrl_C++_Multithreading_Wxwidgets_Stdout_Redirect - Fatal编程技术网

C++ C++;WxWidgets:跨多个线程将Stdout重定向到wxtxtCtrl

C++ C++;WxWidgets:跨多个线程将Stdout重定向到wxtxtCtrl,c++,multithreading,wxwidgets,stdout,redirect,C++,Multithreading,Wxwidgets,Stdout,Redirect,我的应用程序是一个多线程应用程序(使用wxThreads)。目前,主线程及其子工作线程正在向Stdout(使用cout)输出各种消息 我有一个带有WXTEXTCRL的新框架/窗口,希望将所有StdOut消息重定向到它 GuiLogFrame *logframe; logframe = new GuiLogFrame(NULL, wxID_ANY, wxEmptyString); logframe->Show(); logredirector = new wxStreamToT

我的应用程序是一个多线程应用程序(使用wxThreads)。目前,主线程及其子工作线程正在向Stdout(使用cout)输出各种消息

我有一个带有WXTEXTCRL的新框架/窗口,希望将所有StdOut消息重定向到它

GuiLogFrame *logframe; logframe = new GuiLogFrame(NULL, wxID_ANY, wxEmptyString); logframe->Show(); logredirector = new wxStreamToTextRedirector(logframe->get_log_textctrl()); GuiLogFrame*logframe; logframe=new GuiLogFrame(NULL,wxID_ANY,wxEmptyString); logframe->Show(); logredirector=新的wxStreamToTextRedirector(logframe->get_log_textctrl()); 这不管用。但是如果我替换最后一行

wxStreamToTextRedirector redir(logframe->get_log_textctrl()); wxStreamToTextRedirector redir(logframe->get_log_textctrl()); 只要redir在范围内,标准输出将重定向到logframe WXTEXTCRL。。。我希望它即使超出范围也能保持

我想要的是wxStreamToTextRedirector在应用程序运行的整个过程中保持不变。。。因此,即使是新线程的cout也将重定向到相同的wxtxtctrl


有什么想法吗?

有一点非常重要,那就是GUI操作只能在主线程上完成;如果不这样做,当您同时执行多个GUI操作时,它将崩溃或锁定。这在windows下肯定是正确的,但我相信它适用于所有平台。您需要做的是使用GetEventHandler()->AddPendingEvent将事件发布到控件。然后wx将事件添加到对象的队列中,当主线程运行时,它可以执行GUI操作


这可能不是您问题的确切答案,但它是相关信息。

我找到了一种方法,但没有在多线程应用程序中尝试

您可以使用new在构造函数()上创建指向
wxStreamToTextRedirector
的指针。
然后,不要忘记删除析构函数中的指针。

wxStreamToTextRedirector
是一个RAII类,它将流与其ctor中的文本控件相关联,并在其dtor中断开关联。当然,您可以在堆上创建它,而不是将它用作局部变量,甚至可以手动执行它的ctor/dtor所做的操作,即调用
ostr.rdbuf(text)
,并在以后的某个时间恢复
rdbuf()的原始值

但是,正如arolson101所写的,如果允许多个线程使用相同的
wxTextCtrl
,那么代码中仍然可能存在问题,而简单的重定向对此没有帮助。您需要编写自己的自定义
streambuf
-派生类,这样可以避免立即输出文本,但会向主GUI线程发送一条消息,要求它执行此操作,这并不是一件小事