Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.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
C++ 有没有什么好方法可以快速触发Qt中的信号槽?_C++_Qt_Signals Slots - Fatal编程技术网

C++ 有没有什么好方法可以快速触发Qt中的信号槽?

C++ 有没有什么好方法可以快速触发Qt中的信号槽?,c++,qt,signals-slots,C++,Qt,Signals Slots,在Qt中,多线程使用“emit”发送大量信号,触发器非常慢。似乎有一种排队机制。有什么好方法可以快速触发线路上的信号槽吗?您所问的问题称为Qt::DirectConnection。您需要在connect()中指定它,以保证插槽将立即被调用 使用时: 当信号发出时,将立即调用插槽。插槽在信令线程中执行 否则,默认的Qt方式称为Qt::AutoConnection 如果接收器位于发出信号的线程中,则使用Qt::DirectConnection。否则,将使用Qt::QueuedConnection。连

在Qt中,多线程使用“emit”发送大量信号,触发器非常慢。似乎有一种排队机制。有什么好方法可以快速触发线路上的信号槽吗?

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

使用时:

当信号发出时,将立即调用插槽。插槽在信令线程中执行

否则,默认的Qt方式称为
Qt::AutoConnection

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

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


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

是否希望在发出信号的线程中调用插槽?如果是这样,请确保它是线程安全的,并且它调用的所有内容也是线程安全的!特别是,GUI内容必须全部发生在主线程中!当然,slot方法必须是线程安全的,例如,它排除了GUI的升级。最好将逻辑分为两个相关类,一个具有线程安全插槽,另一个具有“正常”插槽,以避免意外地对线程不安全插槽进行直接线程间连接。@hyde同意,但我们不知道topic starter在插槽中要做什么。他问如何在没有队列的情况下调用插槽:)挑剔,但我不会说“Qt::AutoConnection,在大多数情况下与Qt::QueuedConnection相同”,因为它在线程之间排队,并且在同一个线程中直接进行,所以总是没有“大多数情况”。@hyde ok,从文档中添加了一些完美的信息,而不是大多数情况。希望你现在会喜欢
QMetaObject::Connection QObject::connect(const QObject *sender, const    
   char *signal, const QObject *receiver, const char *method,    
   Qt::ConnectionType type = Qt::AutoConnection)