【问题标题】:C++ WxWidgets: Single log window for messages from Multiple ThreadsC++ WxWidgets:来自多线程的消息的单个日志窗口
【发布时间】:2010-11-10 20:46:27
【问题描述】:

从多个线程收集日志消息并使用窗口显示它们的最佳/正确方法是什么? (当线程正在运行时)。

我目前正在尝试将 stdout (cout) 重定向到 wxTextCtrl,但在尝试通过多个线程执行此操作时失败了。任何帮助,将不胜感激。

【问题讨论】:

    标签: c++ multithreading wxwidgets logging


    【解决方案1】:

    日志记录最近在 wxWidgets 主干中进行了一些重大更新,您可以阅读它们here。其中之一是添加对从主线程以外的线程进行日志记录的支持。

    【讨论】:

      【解决方案2】:

      它以什么方式失败?我不熟悉 wxTextCtrl,但除非它内置同步(即它的线程安全),否则这可能是一个大问题。像这样保护单个资源的最简单方法是通过命名的“互斥锁”。以下示例是您可以在每个线程中执行的操作,以确保一次只有一个人访问此资源(输出窗口)。

      // In each thread's initialization:
      HANDLE mutexHandle = CreateMutex(0,FALSE,"__my_protecting_mutex__");
      
      
      // Whenever you use the debug output:
      
      WaitForSingleObject(mutexHandle, /* Timeout if you like. */ 0xFFFFFFFF );
      // Do our printing here.
      ReleaseMutex(mutexHandle);
      
      
      // In each thread's cleanup:
      CloseHandle(mutexHandle);
      

      所以这基本上保证了在等待和释放之间只能有一个线程。现在,如果您的问题实际上是路由到 wxTextCtrl,我需要更多详细信息。

      编辑:我刚刚意识到我发布的内容是特定于 Windows 的,也许你不在 Windows 上!如果你不是,我没有其他平台同步方法的经验,但是 boost 有一些不是特定于平台的通用库。

      【讨论】:

      • wxWidgets 有一个内置的、跨平台的 wxMutex 类docs.wxwidgets.org/stable/wx_wxmutex.html
      • 同步只是其中的一部分。从不同线程直接写入 wxTextCtrl 是一个坏主意,更好的方法是将日志消息添加到线程安全(同步)数据结构中,并让主 GUI 线程从排队的文本控件中记录日志数据。 wxWidgets 主干现在有这个,请参阅其他答案。
      猜你喜欢
      • 2015-05-03
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2011-10-24
      • 2011-07-11
      • 2012-02-08
      • 2010-11-24
      • 2019-04-21
      相关资源
      最近更新 更多