【问题标题】:C++ WxWidgets: Redirecting Stdout to a wxTextCtrl across mulitple threadsC ++ WxWidgets:跨多个线程将Stdout重定向到wxTextCtrl
【发布时间】:2009-07-15 00:41:14
【问题描述】:

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

我有一个带有 wxTextCtrl 的新框架/窗口,并希望将所有 StdOut 消息重定向到其中。

GuiLogFrame *logframe; logframe = new GuiLogFrame(NULL, wxID_ANY, wx​​EmptyString); 逻辑框架->显示(); logredirector = new wxStreamToTextRedirector(logframe->get_log_textctrl());

这不起作用。但是如果我替换最后一行

wxStreamToTextRedirector redir(logframe->get_log_textctrl());

只要 redir 在范围内,标准输出将被重定向到逻辑框架 wxTextCtrl...我希望它即使超出范围也能保留。

我想要的是 wxStreamToTextRedirector 在应用程序运行的整个过程中保持不变......所以即使是新线程的 cout 也会重定向到同一个 wxTextCtrl。

有什么想法吗?

【问题讨论】:

    标签: c++ multithreading wxwidgets stdout redirect


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 2011-12-28
          • 2014-07-22
          • 1970-01-01
          • 2016-12-06
          • 2016-05-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-31
          • 2012-07-14
          相关资源
          最近更新 更多