C++ 从工作线程安全登录?
在我的一个工作线程中,我想做一些日志记录。日志消息被引导到GUI文本区域,该区域只能从主线程访问。所以问题是:如何安全地从工作线程记录消息 我目前的解决方案是让日志函数检查我们当前是否在主线程中。如果是,那么只需记录。如果否,则将消息添加到挂起消息队列(该队列受互斥锁保护)。主线程还具有一个计时器,该计时器的回调函数(也在主线程中执行)负责将任何挂起的消息排入队列并记录下来C++ 从工作线程安全登录?,c++,multithreading,C++,Multithreading,在我的一个工作线程中,我想做一些日志记录。日志消息被引导到GUI文本区域,该区域只能从主线程访问。所以问题是:如何安全地从工作线程记录消息 我目前的解决方案是让日志函数检查我们当前是否在主线程中。如果是,那么只需记录。如果否,则将消息添加到挂起消息队列(该队列受互斥锁保护)。主线程还具有一个计时器,该计时器的回调函数(也在主线程中执行)负责将任何挂起的消息排入队列并记录下来 上述解决方案只是我自己的一个小发明。有更好或更多的标准解决方案来解决这个问题吗?我建议您只概括“从线程发送日志消息”的一般
上述解决方案只是我自己的一个小发明。有更好或更多的标准解决方案来解决这个问题吗?我建议您只概括“从线程发送日志消息”的一般情况,而不是从主/GUI线程发送消息的特殊情况 通常(根据我不同的经验),总是将日志消息排队供main/gui循环使用,即使是在main/gui线程中发布 它简化了代码,日志消息的显示很少是时间关键的(而且在重新绘制之前不会显示) 它还保留了消息的(一般)自然顺序
您通常会向gui线程发送一个“log message waiting”(日志消息等待)事件来唤醒它。我建议您只概括“从线程发送日志消息”的一般情况,而不是从主/gui线程发送消息的特殊情况 通常(根据我不同的经验),总是将日志消息排队供main/gui循环使用,即使是在main/gui线程中发布 它简化了代码,日志消息的显示很少是时间关键的(而且在重新绘制之前不会显示) 它还保留了消息的(一般)自然顺序
您通常会向gui线程发送一个“log message waiting”(日志消息等待)事件来唤醒它。如果您有一条规则用于登录一个线程(“立即执行”)和另一条规则用于其他线程(“将其添加到队列中以备以后使用”),那么您的日志记录将出现问题。我无法想象这是件好事。为所有日志记录制定一条规则-将其添加到队列中。如果一条规则用于登录一个线程(“立即执行”)而另一条规则用于其他线程(“将其添加到队列中以备以后使用”),则日志记录将出现问题。我无法想象这是件好事。对所有日志记录都有一个规则—将其添加到队列。我会让工作线程在任何时候想要记录某些内容时发出消息信号。然后,GUI线程可以订阅来自线程的消息信号,并在主UI线程中执行消息处理
Qt将处理通过线程边界传递信号的问题。有关更多信息,请参阅。请查看,以查看跨线程边界信号和正在运行的插槽。我会让工作线程在需要记录某些内容时发出消息信号。然后,GUI线程可以订阅来自线程的消息信号,并在主UI线程中执行消息处理
Qt将处理通过线程边界传递信号的问题。有关更多信息,请参阅。查看以查看跨线程边界信号和插槽的运行情况。我会将每条消息记录到一个日志类中。GUI线程将定期调用日志类以获取消息。在logging类中,您可以轻松添加用于添加和删除消息的锁定机制我会将每条消息记录到一个logging类中。GUI线程将定期调用日志类以获取消息。在logging类中,您可以轻松添加用于添加和删除消息的锁定机制我正在使用Qt并在Windows和MacOSX上编译。Linux也需要得到支持,但以后会得到支持。我正在使用Qt并在Windows和MacOSX上编译。Linux也需要得到支持,但以后再支持。我不确定我是否理解。您的意思是,无论您在哪个线程中,您总是将日志消息添加到事件队列?确切地说。将“从另一个线程发送日志消息”作为一般情况。我不确定是否理解。您的意思是,无论您在哪个线程中,您总是将日志消息添加到事件队列?确切地说。将“从另一个线程发送日志消息”作为一般情况。我不熟悉QT中的信号,但要记录的实际消息是否可以构成“信号”的一部分?是的,这是可能的。Qt中的信号定义为类方法,该方法的参数是信号的一部分。基本上,您可以将任何类型作为Qt信号的参数传递,包括自定义的类:我不熟悉Qt中的信号,但要记录的实际消息是否可以构成“信号”的一部分?是的,这是可能的。Qt中的信号定义为类方法,该方法的参数是信号的一部分。基本上,您可以将任何类型作为Qt信号的参数传递,包括自定义的类: