通过Qt信号/插槽跨线程传递对象



我希望在Qt中的线程之间使用信号/插槽机制传递一个对象。 由于我将传递指向对象的指针,因此在接收器端调用对象上的方法是否安全?

根据这个问题,对象不会被复制(因此使用原始对象(。

这安全吗? 还是我在另一个线程中属于一个线程的对象上执行方法? 有没有更好的方法可以做到这一点?

(我在此类中有大约 20 个 getter,所以我不想传递单个变量,而且一些变量实际上也是指向对象的指针(

它不一定是安全的 - 信号和插槽可用于跨越线程边界,因此您最终可能会尝试从另一个线程访问该对象。

将在其中调用插槽的线程由连接类型决定。请参阅文档,但作为示例:

connect(source, SIGNAL(mySignal(QObject*)), destination, SLOT(mySlot(QObject*)), Qt::DirectConnection);

在这种情况下,函数 mySlot(( 将从发出 mySignal(( 信号的同一线程调用。如果您的对象不是从与信号发射器相同的线程以外的任何线程访问的,这将正常工作。

connect(source, SIGNAL(mySignal(QObject*)), destination, SLOT(mySlot(QObject*)), Qt::QueuedConnection);

在这种情况下,函数 mySlot(( 将被排队,并由destination对象的事件循环调用。因此,对对象所做的任何事情都将发生在运行destination的事件循环的线程中。

我个人认为最好坚持将简单的值作为参数传递。即使这可以工作,如果可能从多个线程访问 QObject,也需要向 QObject 添加合适的多线程保护。

首先,在开发多线程应用程序时尝试使用 QtConcurrent 。QtConcurrent 命名空间提供高级 API,可以在不使用互斥锁、读写锁、等待条件或信号量等低级线程原语的情况下编写多线程程序。 之后,安全取决于您的班级成员。如果所有成员都是线程安全的,则所有成员都将安全运行。

最新更新