Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从工作线程安全登录?_C++_Multithreading - Fatal编程技术网

C++ 从工作线程安全登录?

C++ 从工作线程安全登录?,c++,multithreading,C++,Multithreading,在我的一个工作线程中,我想做一些日志记录。日志消息被引导到GUI文本区域,该区域只能从主线程访问。所以问题是:如何安全地从工作线程记录消息 我目前的解决方案是让日志函数检查我们当前是否在主线程中。如果是,那么只需记录。如果否,则将消息添加到挂起消息队列(该队列受互斥锁保护)。主线程还具有一个计时器,该计时器的回调函数(也在主线程中执行)负责将任何挂起的消息排入队列并记录下来 上述解决方案只是我自己的一个小发明。有更好或更多的标准解决方案来解决这个问题吗?我建议您只概括“从线程发送日志消息”的一般

在我的一个工作线程中,我想做一些日志记录。日志消息被引导到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信号的参数传递,包括自定义的类: