问题标签 [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.

0 投票
2 回答
168 浏览

qt - 记录排队的连接

我正在使用使用 Qt 5.4 构建的复杂状态引擎系统(使用自定义状态引擎类)。

该代码的一部分是记录事件、转换等。记录引擎/状态对象接收的所有事件对我来说非常重要,这样我就可以完全跟踪状态引擎中发生的事情。

对于大多数事件类型,日志记录很容易。但是我未能记录排队的连接(即元呼叫事件)。QMetaCallEvent 是私有的,所以我无能为力。然而,很难相信不能正确检查 Qt 的这样一个组成部分。

有没有我错过的方法可以记录排队的连接(包括信号名称、插槽名称、发送方名称、接收方名称和参数,如果可能的话)?

0 投票
2 回答
411 浏览

c++ - single Qt::QueuedConnection 在单线程应用程序中是如何工作的?

我正在做:

但是插槽被调用的次数远远少于它应有的次数。

似乎它错过了很多信号,可能是因为插槽需要很长时间(确实如此)。

我在 tcp 写入之间的传输端添加了 2ms 的延迟,它变得更好:插槽被调用得更多。

问题:如果信号和槽在同一个线程中,当槽已经运行时,接收器是否还在排队输入信号?

0 投票
0 回答
497 浏览

multithreading - QT5 跨线程通信,插槽未在“this”上下文中调用

由于 moveToThread 方法,我有一个对象MainWorker作为单独的线程运行。 MainWorker有一个成员SubWorker,它也作为单独的线程运行。两个线程都在无限循环中工作。

这个想法是,MainWorkerSubWorker都执行一些单独的计算。每当SubWorker完成计算时,它应该将结果通知MainWorker

因此,我直观地在 SubWorker 发出的信号和 MainWorker 的插槽之间建立了第一个连接它不起作用,所以我又建立了两个连接以排除一些潜在的问题:

看来,不起作用的正是我所需要的——跨线程通信,因为连接 2 和 3 按预期工作。我的问题是:如何使连接 1 工作?

编辑:显然,在 Karsten 的解释之后,很明显无限循环阻塞了 EventLoop。所以新的问题是,我如何从无限循环线程向其父线程发送消息(信号等)?

我是 Qt 的新手,我很有可能完全错了。这是最小(不)工作的例子:

MainWorker.h

子工作者.h

主文件

0 投票
0 回答
1145 浏览

python - PyQt QueuedConnection 有时有效

我有一个使用 QThreads 的应用程序。我正在向排队连接添加不同的方法,它们按该顺序运行。这一直运作良好。但是取决于测试的顺序(序列可以是任何顺序),我的应用程序将停止(它不会冻结,但它不会完成调用队列中的其余测试)。例如,如果运行序列 [test1, test2, test3]。我将能够运行并完成(发出完成信号)test1 和 test2,但不会调用 test3。然而,这只是偶尔发生,而不是一直发生。我认为线程在所有任务完成之前就退出了。有什么我应该清理的吗?

相关代码如下:

工作线程:

0 投票
1 回答
267 浏览

c++ - 注册类型与容器

如果我注册如下自定义类型,用于排队连接:

我可以将队列连接中的类型与这样的信号一起使用:

现在我也想使用带有这样信号的类型:

我记得我在某处读到 Qt 自动允许将已注册类型与容器一起使用,而无需显式注册特定类型/容器组合。

但这对我不起作用。我还必须注册容器:

如果没有后一个注册码,它应该工作吗?这真的有必要吗?容器应该开箱即用吗?

0 投票
1 回答
1174 浏览

c++ - 异步调用插槽而不使用清晰的代码行连接到它

我遇到了非常奇怪的错误 -QAction::trigger导致出现阻塞对话框,这导致我调用trigger的服务器卡住(例如,在对话框关闭之前无法处理套接字信号)。

我想出了一个解决方法。我使用将信号连接void triggerWorkaround()到插槽并发出它:QAction::triggerQt::QueuedConnection

但这是三行令人困惑的代码。有没有一种不混淆的方法来做到这一点?我发现QMetaObject::invokeMethod,但坦率地说,这比我目前的解决方案更令人困惑 10 倍。另外,我不想将方法名称用作字符串!

0 投票
2 回答
5197 浏览

c++ - QObject::connect: 不能对 MyClass*const 类型的参数进行排队

我有这样的课:

我有一个信号:

我想通过 QueuedConnedtion 连接它。我不断收到此消息:

我在声明之后像这样注册我的班级:

我还添加了这个从构造函数调用的静态方法:

我也尝试注册const指针:

它会导致以下错误:

那么如何让我的班级使用排队连接?

0 投票
1 回答
805 浏览

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() 等中)。

我有两个问题:

  1. 为什么模态对话框需要嵌套事件循环?从我的理解来看,阻止父窗口的输入似乎不需要这个。

  2. 是否可以以模态方式使用 QProgressDialog 但没有嵌套事件循环?

0 投票
1 回答
1157 浏览

c++ - Qt::QueuedConnection 不适用于某些对象

在我的应用程序中,我们在信号槽之间建立了一个简单的连接。

不幸的是,这种联系会导致递归。然后我们把它改成

它不再起作用了。该插槽永远不会被调用。

我尝试更改myObjectaQString并且它按预期工作。所以问题myObject在于Qt不太喜欢。

我检查了Class Qt.ConnectionTypeSignals & SlotsQObject doc,寻找Qt::QueuedConnection但我没有找到对我的情况的澄清。

关于我的代码的一些注释:

  • myObject信号发射后立即破坏。但这不应该是一个问题,可以制作一个副本(就像我想的那样,QString 没有这个问题,我的意思是,即使我通过一个临时QString的并在信号发射后立即销毁它,插槽无论如何都按预期调用)

  • myObject不是 a QObject,并且它的成员中没有一个是 a QObject(如果它可以产生一些影响)

  • myObject可以复制

  • 我的应用程序是单线程

  • myObject没有默认构造函数(但我认为它不应该影响它,因为可以制作副本)

  • 我正在使用 Qt 5.7

有人对这个问题有一些澄清吗?

实际上,文档Qt::QueuedConnection似乎没有那么详细,请参阅我上面发布的链接。你有一些更有用的链接吗?

0 投票
2 回答
646 浏览

c++ - Qt 的事件循环线程是安全的还是原子的?处理 `QueuedConnection` 时如何同步?

假设 2 QThreads 以下列关系运行:

因此,当来自一个线程的对象发出信号时,会调用另一个线程的插槽。正如Qt 信号(QueuedConnection 和 DirectConnection)中所讨论的,由于Qt::QueuedConnectionSignal()被发布/附加到 Thread2 的事件循环中。当它轮到时,Slot()被调用。

问题:事件循环本身是线程安全的吗?
即。如果 Thread1 和 Thread3 都同时向 Thread2 的事件循环发布信号怎么办。