Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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
Multithreading 可以从另一个QThread安全地发出Qt信号吗_Multithreading_Qt_Signals Slots_Qthread - Fatal编程技术网

Multithreading 可以从另一个QThread安全地发出Qt信号吗

Multithreading 可以从另一个QThread安全地发出Qt信号吗,multithreading,qt,signals-slots,qthread,Multithreading,Qt,Signals Slots,Qthread,我在应用程序中使用了一些QThread 我的对象“生活”在不同的线程中(它们的所有者线程作为Qt的意思是不同的),并使用带有排队连接的信号/插槽进行通信 现在,我有一个问题: 对象“A”位于QThread“A”中 对象“B”存在于QThread“B”中 Gui生活在“主线程”中 然后: 对象“A”从其自己的线程“A”调用“B”实例上的方法B::foo 此B::foo方法共享的资源使用互斥锁进行保护,从线程“a”执行B::foo没有问题 在B::foo方法中,对象“B”发出信号barSign

我在应用程序中使用了一些
QThread

我的对象“生活”在不同的线程中(它们的所有者线程作为Qt的意思是不同的),并使用带有排队连接的信号/插槽进行通信

现在,我有一个问题:

  • 对象“A”位于
    QThread
    “A”中
  • 对象“B”存在于
    QThread
    “B”中
  • Gui生活在“主线程”中
然后:

  • 对象“A”从其自己的线程“A”调用“B”实例上的方法
    B::foo
  • B::foo
    方法共享的资源使用互斥锁进行保护,从线程“a”执行
    B::foo
    没有问题
  • B::foo
    方法中,对象“B”发出信号
    barSignal
我对他的配置有一些疑问:

  • 从不是“B”所有者的线程发出对象“B”的信号是否安全

  • 使用
    Qt::AutoConnection
    在“Qt主线程”中的GUI对象中接收此信号是否安全

  • 使用
    Qt::AutoConnection
    在对象“C”中接收此信号安全吗?对象“C”居住在它自己的
    QThread
    “C”中

我的测试倾向于对一切都说“是”。 通过读取Qt
emit
代码,它似乎正常。
但是它在Qt文档中没有找到任何关于“从不是发射器所有者线程的线程发出信号”的内容。

如果使用自动或排队连接,从其他线程发出信号是安全的。当信号在接收
QObject
没有亲缘关系的线程中发出时,Auto被推断为排队。直接连接不是线程安全的

文档中有一节介绍如何向不同线程中的对象发送信号

排队连接-当控制返回到接收方线程的事件循环时,将调用插槽。插槽在接收器的线程中执行

可以通过向connect()传递附加参数来指定连接类型。请注意,如果事件循环正在接收方的线程中运行,那么当发送方和接收方位于不同线程中时使用直接连接是不安全的,原因与在另一个线程中的对象上调用任何函数是不安全的相同

QObject::connect()本身是线程安全的

还有一点我建议你多读一些背景知识。