从工作线程安全地记录?

时间:2009-11-18 08:40:40

标签: c++ multithreading

在我的一个工作线程中,我想做一些日志记录。日志消息被引导到GUI textarea,只能从主线程访问。所以问题是:如何从工作线程安全地记录消息?

我目前的解决方案是让日志功能检查我们当前是否在主线程中。如果是,那么只需登录。如果不是,则将消息添加到待处理消息队列(此队列受互斥锁保护)。主线程还有一个定时器,它的回调函数(也在主线程中执行)负责出列并记录任何未决消息。

以上解决方案只是我自己的小发明。这个问题有更好或更标准的解决方案吗?

4 个答案:

答案 0 :(得分:3)

如果您有一个规则用于登录一个线程(“只是立即执行”)和另一个规则用于其他线程(“将其添加到队列中以供日后使用”),那么您的日志记录将失序。我无法想象这是一件好事。为您的所有日志记录制定一条规则 - 将其添加到队列中。

答案 1 :(得分:1)

我建议您只概括一般'从线程发送日志消息'的情况,而不是从主/ GUI线程发送消息的特殊情况。

正常(在我不同的经验中)总是将主/ gui循环的日志消息排队,即使在main / gui线程中发布也是如此。

它简化了代码,并且日志消息的显示很少是时间关键的(并且在重新绘制服务之前无法显示等等。)

它还保留了消息的(一般)自然顺序。

您通常会向您的gui线程发送一个“日志消息等待”事件以将其唤醒。

答案 2 :(得分:1)

我会让工作线程在想要记录某些内容时发出消息信号。然后,GUI线程可以从您的线程订阅消息信号,并在主UI线程中执行消息处理。

Qt将处理通过线程边界传递信号的问题。有关详细信息,请参阅Signals and slots accross threads。查看non-blocking fortune client-server example以查看跨线程边界信号和插槽。

答案 3 :(得分:0)

我会将每条消息记录到日志记录类中。 GUI线程将定期调用消息的日志记录类。在日志记录类中,您可以轻松添加用于添加和删除消息的锁定机制