已在对象上调用该方法QObject::moveToThread
。因此,当信号到达时,相应的槽会在指定的线程中执行。有时添加信号只是为了调用适当的插槽是不合理的:它会使代码混乱。我发现这种方法可以在没有信号的情况下调用插槽:
QMetaObject::invokeMethod(obj, "slot1", Qt::QueuedConnection);
但在这里我不喜欢使用文本方法名称。我想在编译时检查方法是否存在。如何才能做到这一点?
更新。也许有一种方法可以QtConcurrent::run
指定特定的线程?
在
QMetaObject::invokeMethod()
检查目标方法(插槽)是否存在的情况下,只有在程序执行阶段才有可能。QtConcurrent
不提供对流的公共访问,因此无法选择特定的流。线程间通信的另一种选择是使用事件。使用 继承您自己的事件类型
QEvent
,并转发到目标线程中存在的对象QCoreApplication::postEvent()
。当然,这种方法会需要更多的代码,但它可以让你在编译阶段跟踪传输数据类型的对应关系(至少通过检查事件类)。