首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C++中从多个线程调用Qt中窗口小部件类的信号函数安全吗?

在C++中从多个线程调用Qt中窗口小部件类的信号函数安全吗?
EN

Stack Overflow用户
提问于 2013-08-28 08:17:13
回答 3查看 244关注 0票数 0

同时从多个线程调用widget的信号函数安全吗?当多个线程同时调用某个窗口小部件的信号时,Qt会使用某种内部互斥锁来提供自己数据结构的安全性吗?

据我所知,这是安全的,一个信号函数的N个同时调用将导致一个连接的信号的N个顺序调用。

我说的对吗?

备注:调用信号函数的线程是用boost创建的。我认为,这对这个问题并不重要。我不能使用其他线程,因为这些线程不仅与GUI相关,而且它们服务于程序的许多部分。

EN

回答 3

Stack Overflow用户

发布于 2013-08-28 10:01:18

简而言之,你不是调用一个信号,而是发出一个信号。然后,Qt在内部处理信号连接到的任何时隙的触发。

发出信号并使其触发插槽可能是线程安全的,也可能不是线程安全的,这取决于连接类型。

有关更多信息,请阅读here

我认为boost创建的线程将会是一个问题--信号/槽机制依赖于QThread和QObject的基础设施。如果你可以使用QThread而不是boost线程,这可能会更好,也更简单。

票数 1
EN

Stack Overflow用户

发布于 2013-08-28 17:20:57

所以你(可能)会因为使用boost线程而出现问题。

但是,有一个简单的解决方案:确保使用Qt::QueuedConnection连接信号和插槽。(这是当对象位于不同的线程中时,使用QThreads自动执行的操作)。

如果需要同步执行插槽(即所有插槽必须在发出信号的代码继续执行之前完成),请使用Qt::BlockingQueuedConnection

票数 0
EN

Stack Overflow用户

发布于 2013-08-28 20:52:08

这取决于连接。如果是直接连接,则发射线程将用于将信号传送到连接的插槽。这个安全吗?这取决于插槽。特别是,QWidget上的插槽无法处理此问题。如果该连接已排队,则存储该信号。接收器对象有一个关联的QThread,该线程有一个事件循环,该事件循环将存储的信号传递给接收器。

您的问题描述了排队连接的行为。这是一种有效的可能性。Qt事件循环是线程安全的。向它传送信号和从它调用插槽都得到了适当的保护。由于每个接收器只有一个QThread,这意味着排队的信号是按顺序传送的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18477448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档