有啥好方法可以快速触发 Qt 中的信号槽吗?

Posted

技术标签:

【中文标题】有啥好方法可以快速触发 Qt 中的信号槽吗?【英文标题】:Is there any good way to quickly trigger a signal slot in Qt?有什么好方法可以快速触发 Qt 中的信号槽吗? 【发布时间】:2016-10-27 03:38:07 【问题描述】:

在Qt中多线程使用'emit'发送大量信号,触发很慢。貌似有排队机制。有什么好办法可以快速触发线路上的一个信号槽?

【问题讨论】:

你想在发出信号的线程中调用槽吗?如果是这样,请确保它是线程安全的,并且它调用的所有内容也是线程安全的!特别是,GUI 的东西必须全部发生在主线程中! 【参考方案1】:

你问的是Qt::DirectConnection。您需要在connect() 中指定它以保证插槽将立即被调用。

使用时:

当信号发出时,槽会立即被调用。该槽在信号线程中执行。

否则默认Qt方式调用Qt::AutoConnection

如果接收者位于发出信号的线程中,则使用 Qt::DirectConnection。否则,使用 Qt::QueuedConnection。连接类型在信号发出时确定。

您可以在connect()中指定连接类型:

QMetaObject::Connection QObject::connect(const QObject *sender, const    
   char *signal, const QObject *receiver, const char *method,    
   Qt::ConnectionType type = Qt::AutoConnection)

关于这两者之间的区别以及如何使用的很好的答案是here。

【讨论】:

当然,slot 方法必须是线程安全的,例如不包括更新 GUI。最好将逻辑分成两个相关的类,一个具有线程安全插槽,另一个具有“普通”插槽,以避免意外地为线程不安全插槽进行直接线程间连接。 @hyde 同意,但我们不知道启动者想在插槽中做什么。他只是问如何在没有队列的情况下调用插槽:) 吹毛求疵,但我不会说 "Qt::AutoConnection 在大多数情况下与 Qt::QueuedConnection 相同",因为它在线程之间排队并直接总是在同一个线程中,没有“大多数情况”。 @hyde 好的,从文档中添加了一些完美的信息,而不是大多数情况。希望你现在会喜欢它

以上是关于有啥好方法可以快速触发 Qt 中的信号槽吗?的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5快速上手基础篇2-按钮控制LCD屏显示

Qt编程中信号与槽机制可以用啥方法替换

Qt信号与槽函数问题

PyQt5快速入门PyQt5信号槽机制

Qt的信号槽机制可以保障线程安全吗

Qt C++ 信号和槽没有触发