0

我的应用程序是一个多线程应用程序(使用 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。

有什么想法吗?

4

3 回答 3

2

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

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

于 2009-07-28T03:02:36.720 回答
0

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

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

于 2012-12-05T01:06:56.200 回答
0

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

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

于 2010-12-13T13:20:13.297 回答