我搜索了这个网站和QT文档,但找不到并直接回答以下问题:
假设我有一个只有一个插槽的工人班:
void Worker::testSlot(){
//access data and do some calculation
}
现在,如果此插槽连接到其他线程上运行的其他类的信号,并且如果使用了排队连接,是否有必要在访问worker中的数据之前使用lock(QMutexLocker)?我认为不需要它,因为testSlot()总是在一个线程中执行(工作者被移动的线程),因此它是同步的。即使同时从不同的线程发出两个信号,也没有办法暂停执行第一个信号的中途插槽和第二个信号的启动。但我不确定这一点。
答案 0 :(得分:0)
你是100%正确。
信息的关键位是通过排队或自动连接发送连接到不同线程中的对象的信号导致向目标对象发布QMetaCallEvent
。它根本不会直接导致任何调用。
在目标对象所在的线程中运行的事件循环将玩具传递给对象 - 您可以通过正确覆盖event
方法并在事件具有{{MetaCall
时输出调试消息来验证1}}类型。记得在重新实现时调用基类的方法。由于事件循环同步运行,因此它会串行执行调用。因此,不需要额外的序列化访问装置。元调用事件从哪个线程发布并不重要 - 线程本身不用于发布,并且事件队列看起来是相同的,无论是从一个线程还是多个线程发布了多个事件。 / p>
QObject::event
方法处理QMetaCallEvent
并执行调用。调用可以是一个槽,一个可调用的方法,一个构造函数/析构函数,或者一个在给定对象的线程上下文中执行的函子。