问题标签 [queued-connection]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
qt - 记录排队的连接
我正在使用使用 Qt 5.4 构建的复杂状态引擎系统(使用自定义状态引擎类)。
该代码的一部分是记录事件、转换等。记录引擎/状态对象接收的所有事件对我来说非常重要,这样我就可以完全跟踪状态引擎中发生的事情。
对于大多数事件类型,日志记录很容易。但是我未能记录排队的连接(即元呼叫事件)。QMetaCallEvent 是私有的,所以我无能为力。然而,很难相信不能正确检查 Qt 的这样一个组成部分。
有没有我错过的方法可以记录排队的连接(包括信号名称、插槽名称、发送方名称、接收方名称和参数,如果可能的话)?
c++ - single Qt::QueuedConnection 在单线程应用程序中是如何工作的?
我正在做:
但是插槽被调用的次数远远少于它应有的次数。
似乎它错过了很多信号,可能是因为插槽需要很长时间(确实如此)。
我在 tcp 写入之间的传输端添加了 2ms 的延迟,它变得更好:插槽被调用得更多。
问题:如果信号和槽在同一个线程中,当槽已经运行时,接收器是否还在排队输入信号?
multithreading - QT5 跨线程通信,插槽未在“this”上下文中调用
由于 moveToThread 方法,我有一个对象MainWorker作为单独的线程运行。 MainWorker有一个成员SubWorker,它也作为单独的线程运行。两个线程都在无限循环中工作。
这个想法是,MainWorker和SubWorker都执行一些单独的计算。每当SubWorker完成计算时,它应该将结果通知MainWorker。
因此,我直观地在 SubWorker 发出的信号和 MainWorker 的插槽之间建立了第一个连接,但它不起作用,所以我又建立了两个连接以排除一些潜在的问题:
看来,不起作用的正是我所需要的——跨线程通信,因为连接 2 和 3 按预期工作。我的问题是:如何使连接 1 工作?
编辑:显然,在 Karsten 的解释之后,很明显无限循环阻塞了 EventLoop。所以新的问题是,我如何从无限循环线程向其父线程发送消息(信号等)?
我是 Qt 的新手,我很有可能完全错了。这是最小(不)工作的例子:
MainWorker.h
子工作者.h
主文件
python - PyQt QueuedConnection 有时有效
我有一个使用 QThreads 的应用程序。我正在向排队连接添加不同的方法,它们按该顺序运行。这一直运作良好。但是取决于测试的顺序(序列可以是任何顺序),我的应用程序将停止(它不会冻结,但它不会完成调用队列中的其余测试)。例如,如果运行序列 [test1, test2, test3]。我将能够运行并完成(发出完成信号)test1 和 test2,但不会调用 test3。然而,这只是偶尔发生,而不是一直发生。我认为线程在所有任务完成之前就退出了。有什么我应该清理的吗?
相关代码如下:
工作线程:
c++ - 注册类型与容器
如果我注册如下自定义类型,用于排队连接:
我可以将队列连接中的类型与这样的信号一起使用:
现在我也想使用带有这样信号的类型:
我记得我在某处读到 Qt 自动允许将已注册类型与容器一起使用,而无需显式注册特定类型/容器组合。
但这对我不起作用。我还必须注册容器:
如果没有后一个注册码,它应该工作吗?这真的有必要吗?容器应该开箱即用吗?
c++ - 异步调用插槽而不使用清晰的代码行连接到它
我遇到了非常奇怪的错误 -QAction::trigger
导致出现阻塞对话框,这导致我调用trigger
的服务器卡住(例如,在对话框关闭之前无法处理套接字信号)。
我想出了一个解决方法。我使用将信号连接void triggerWorkaround()
到插槽并发出它:QAction::trigger
Qt::QueuedConnection
但这是三行令人困惑的代码。有没有一种不混淆的方法来做到这一点?我发现QMetaObject::invokeMethod
,但坦率地说,这比我目前的解决方案更令人困惑 10 倍。另外,我不想将方法名称用作字符串!
c++ - QObject::connect: 不能对 MyClass*const 类型的参数进行排队
我有这样的课:
我有一个信号:
我想通过 QueuedConnedtion 连接它。我不断收到此消息:
我在声明之后像这样注册我的班级:
我还添加了这个从构造函数调用的静态方法:
我也尝试注册const
指针:
它会导致以下错误:
那么如何让我的班级使用排队连接?
c++ - 模态 QProgressDialog::setValue() 导致嵌套事件循环崩溃
我刚刚写了一些基于 QThread 的代码来执行一个大的计算。为了可视化进度,我需要打开一个 QProgressDialog。该对话框是应用程序模式(使用 open()),因为我不想在计算期间允许修改主窗口。线程发出各种信号,允许在 GUI 和线程之间进行基于状态机的通信。
线程的工作对象发出的两个信号是“Progress”和“Finished”。如果发出“Progress”,我将使用 setValue() 更新 QProgressDialog。如果发出“Finished”,则对话框被销毁。
在计算结束时会发生以下情况:
- 发出“进度”事件 (100%)
- “完成”后直接发出
- 由于“进度”事件而调用 setValue(100)
- 因为对话框是模态的,所以 setValue() 调用 processEvents()
- processEvents() 传递“Finished”事件
- “Finished”事件导致 Dialog 在 setValue() 中间被销毁,从而导致崩溃
QProgressDialog 通过在 setValue() 中调用 processEvents() 来破坏我的架构。此外,我的编码约定禁止使用任何嵌套的事件循环(如在 exec() 等中)。
我有两个问题:
为什么模态对话框需要嵌套事件循环?从我的理解来看,阻止父窗口的输入似乎不需要这个。
是否可以以模态方式使用 QProgressDialog 但没有嵌套事件循环?
c++ - Qt::QueuedConnection 不适用于某些对象
在我的应用程序中,我们在信号槽之间建立了一个简单的连接。
不幸的是,这种联系会导致递归。然后我们把它改成
它不再起作用了。该插槽永远不会被调用。
我尝试更改myObject
aQString
并且它按预期工作。所以问题myObject
在于Qt不太喜欢。
我检查了Class Qt.ConnectionType、Signals & Slots和QObject doc,寻找Qt::QueuedConnection
但我没有找到对我的情况的澄清。
关于我的代码的一些注释:
在
myObject
信号发射后立即破坏。但这不应该是一个问题,可以制作一个副本(就像我想的那样,QString 没有这个问题,我的意思是,即使我通过一个临时QString
的并在信号发射后立即销毁它,插槽无论如何都按预期调用)myObject
不是 aQObject
,并且它的成员中没有一个是 aQObject
(如果它可以产生一些影响)myObject
可以复制我的应用程序是单线程
myObject
没有默认构造函数(但我认为它不应该影响它,因为可以制作副本)我正在使用 Qt 5.7
有人对这个问题有一些澄清吗?
实际上,文档Qt::QueuedConnection
似乎没有那么详细,请参阅我上面发布的链接。你有一些更有用的链接吗?
c++ - Qt 的事件循环线程是安全的还是原子的?处理 `QueuedConnection` 时如何同步?
假设 2 QThread
s 以下列关系运行:
因此,当来自一个线程的对象发出信号时,会调用另一个线程的插槽。正如Qt 信号(QueuedConnection 和 DirectConnection)中所讨论的,由于Qt::QueuedConnection
,Signal()
被发布/附加到 Thread2 的事件循环中。当它轮到时,Slot()
被调用。
问题:事件循环本身是线程安全的吗?
即。如果 Thread1 和 Thread3 都同时向 Thread2 的事件循环发布信号怎么办。