问题标签 [qeventloop]

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 投票
1 回答
319 浏览

qt - QEventLoop 仅等待本地事件而不是主循环事件

我正在尝试执行网络请求并等待响应,然后再继续。虽然使用 QEventLoop 可以等待请求,但问题是如果在程序的其他部分触发了其他信号,它们将首先执行。

这是重现问题的代码示例。您可以看到网络请求(我在这里仅使用http://example.com为例)显然会在第二个singleShot计时器触发之前发出。

这是输出: 在此处输入图像描述

这是所需的输出: 在此处输入图像描述

编辑

添加更多信息。上面的代码显然是对问题的过度简化,因为我不能轻易发布所有代码。基本上发生的事情是在我的项目中的其他地方有代码会发出一个连接到longFunction()上面的信号。显然,我想在继续之前等待来自 REST 调用的响应,因为响应将在该函数稍后指示元素。问题是在稍后的某个时间点(可能在 REST 调用完成之前),我的代码的其他一些部分可能会触发其他一些信号,我不希望处理这些其他信号。我只想等待处理上的 ONE 连接localEventLoop

任何帮助将不胜感激

0 投票
1 回答
89 浏览

c++ - 如何结束图形 GUI 并执行控制台功能(QT)?

我对 QT 完全陌生,我想准备一个窗口并从用户那里获取一些输入,然后使用此输入运行一个控制台并在控制台中显示输出。我曾尝试在 exec 之后编写代码,但似乎不可能:

我不知道为什么,但是在 a.exec(); 之后 什么都没发生。所以我在互联网上搜索并在stackoverflow中找到了以下主题: 显示窗口后如何调用函数?

但我想结束图形窗口,然后做我的过程。

0 投票
1 回答
417 浏览

qt - 如何修复“在 Qt 中将两个定时器变为一个函数,使用 qmutex 将 qeventloop 进行睡眠”

我有一些代码使用qtcpsocket读写,write-->sleep-->read;并且 ui 有 2 个或更多计时器来使用此功能;我希望我同步运行;所以我添加互斥锁来锁定它;由它陷入僵局;

qt4; qt5;

我希望我运行并输出为:登录乐趣...获得锁定乐趣...退出乐趣...登录乐趣...获得锁定乐趣...退出乐趣...

但它像这样运行:登录乐趣...获得锁定乐趣...登录乐趣.... ------------------------ - - - - -不再 - - - - - - - - - - -

0 投票
0 回答
408 浏览

qt - QRenderCapture 保存奇怪的截图

我们公司需要捕捉一个Qt3d场景的渲染。为此,我创建了一个小示例应用程序,它说明了我们捕获的用法。

在左侧,您将找到 3D 场景,在右侧有QLabel一个QPixmap显示捕获屏幕的 3D 场景。

现在,由于某种原因,我真的不明白捕获的屏幕截图与左侧的 3D 场景相比看起来确实不同。QLabel与右侧相比,保存的 PNG 图像看起来更令人困惑,但实际上我对我的用例中的 PNG 更感兴趣。

屏幕截图不同于 3d 场景

它为我节省了以下 PNG 文件:

保存的 PNG 文件

我已经尝试QRenderCapture在框架图的不同位置插入,但没有一个地方给出合理的结果。

这是我的frameGraph->dumpObjectTree输出:

看来,我在渲染过程中的某个地方捕获了 3d 场景,因此可能存在一些时间问题。(QEventLoop在这个用例中可能不允许使用 of,但我真的不知道为什么。)

QRenderCapture暗示的文档,这QRenderCapture应该是框架图的最后一个叶子节点,但这就是我所做的。

来自 QRenderCapture 文档:

QRenderCapture 用于在任何渲染阶段将渲染捕获到图像中。捕获必须由用户启动,并且每个捕获请求返回一个图像。用户可以同时发出多个渲染捕获请求,但每个 QRenderCapture 实例每帧只提供一个请求。

并且:

用于请求渲染捕获。即使帧图有多个叶节点,每次 requestCapture 调用也只会产生一个渲染捕获结果。该函数返回一个 QRenderCaptureReply 对象,该对象在完成时接收捕获的图像。用户负责释放返回的对象。

这里有人可以帮我吗?

0 投票
2 回答
545 浏览

c++ - QCoreApplication::processEvents - 为什么必须只从主线程调用它?

既然只有一个QCoreApplication对象,为什么从哪个线程QCoreApplication::processEvents()调用很重要?

毕竟,线程都共享相同的地址空间。

0 投票
1 回答
789 浏览

c++ - 调用 exit() quit() 或 terminate() 后 Qt 线程执行不会停止

首先,我已经阅读了QThread并使用了QEventLoop但我并不完全确定我的实现是否正确。

TL;DR 请参阅下面的问题详细信息

最有用的信息来源是Qt WikiKDAB Qthread演示文稿(对 w/&w/o 事件循环有用)、此处此处与此问题相关的 SO 帖子。

我的情况是:

我有一个可能运行时间很长的函数,其中包含多个 I/O 磁盘调用。因此我需要一个线程来不阻塞 UI。为此,我自己实现了一个线程。

TL;DR QThreads

我的理解是QThread是一个单独的事件循环对象,并且需要自定义run()实现或将对象移动到新创建的线程对象,其中移动的对象存在(并运行)。我所描述的是带有事件循环实现的。

问题

我可能会遗漏一些东西,因为我上面描述的这个实现不能正常工作。我怎么知道这一点,上面的 Qt Docs 和 SO 帖子提到QThread::quit()QThread::exit()依赖于QEventLoop,如果QThread::exec()没有运行(通过调用QThread::run()通过QThread::start() ),那么quit()exit()函数将永远不会运行,这是我的问题

我的实现理念类似于 Java 的 Thread & Lambda 语法,例如

我使用了以下实现

可以使用 lambda 的各种线程对象容器

简单的示例用法是(在内部完成线程和子对象清理QWorkerThread):

问题详情/示例

调用QThread::quit()or , QThread::quit()then不会终止线程。在 lambda (inside ) 中定义的长时间运行的进程将一直运行到完成。QThread::terminate()QThread::wait()setRunnable()

我知道这篇文章比传统的要长,但我希望每个人都能全面了解我正在努力实现的目标,因为我不确定我的问题到底出在哪里。

任何帮助将不胜感激!


代码实现

我将发布所有代码以全面了解实现,以防我错过重要的事情。

QWaitThread.h是一个实现QThread

QWaitThread.cpp

QInterruptable.h接口定义了一些预期的功能

ThreadWorker.h是存在(并运行)内部的对象QWaitThread

线程工作者.cpp

QWorkerThread.h感兴趣的主类,接受可运行的lambda,主“线程”处理发生在哪里,移动到线程,启动线程,处理事件等

QWorkerThread.cpp实现


更新一些额外的信息

关于~QWorkerThread(),我注意到在调用delete QThreador时QThread::deleteLater()QWaitThread()(or QThread) 会抛出一个致命错误:线程在运行时被销毁。这是在quit()/terminate()被调用之后。

QThread.cpp中的以下行

在哪里

0 投票
1 回答
298 浏览

qt - Qt 如何在同一个 EventLoop 中处理事件和信号

我不明白 qt 如何在同一个事件循环中处理事件(例如定时器事件、套接字事件等)和信号。据我所知,定时器和套接字事件是通过 select 系统调用(在 Unix 等操作系统中)处理的。

由于 select 系统调用,事件循环如何在睡眠时处理信号。

0 投票
1 回答
666 浏览

python - python和PyQt5中的Quamash QventLoop“RuntimeError:没有运行事件循环”错误

我似乎没有找到解决此错误的正确方法。该程序不断给出“RuntimeError:没有正在运行的事件循环”。为什么事件循环没有运行?

这是用于学习此概念的在线示例之一。它似乎适用于其他学生程序员,但对我来说,它给了我上面突出显示的错误。

0 投票
0 回答
50 浏览

python - QWebEnginePage.javaScriptConfirm 中的 QEventLoop 完全跳过

我有一个子类QWebEnginePage,我想覆盖该javaSrciptConfirm函数以创建我自己的弹出窗口。它可以通过启动, 并将弹出窗口上的 OK 和 Cancel 按钮QEventLoop的信号连接到插槽来工作。QPushButton.clicked.connectQEventLoop.quit

我无法让它工作,因为它似乎QEventLoop立即被完全绕过了。所以我尝试了只显示在左上角的黄色按钮,当它被点击时它应该退出QEventLoop,然后变成红色,这仍然不起作用:

当程序运行时,它导航到https://www.seleniumeasy.com/test/javascript-alert-box-demo.html,然后我单击显示 JS 确认框的按钮(向下第二个按钮)。在屏幕的一角,会显示一个红色按钮。它应该是黄色的,并且只有在我单击它时才会变为红色,但从QEventLoop不循环,它会立即退出。当我可以让按钮保持黄色直到被点击时,我可以删除它并将弹出按钮连接到QEventLoop.quit插槽。

我尝试将loop变量 aself.loop设为不同的父对象QEventLoop,将a 设为buttona self.button,但我不确定为什么循环会立即退出。QEventLoop为了真正循环,我需要更改什么?

0 投票
0 回答
121 浏览

qt - 未使用 WASM 调用 QEventLoop 插槽

我正在尝试运行以下代码:

当我使用 QT 将其编译为 c++ 文件时,此方法运行完美。但是我在构建 wasm 并调用此方法时遇到了问题。未调用事件循环的退出槽,因此未收到我等待获得的响应。浏览器变得无响应。在 Firefox 上,当我收到终止/等待页面响应的通知时,如果我单击终止,则在网络选项卡中我看到网络休息成功完成。在浏览器窗口中,控制台没有打印出响应。

有谁知道如何解决这个问题?

对于我的要求,我需要在 C++ 中创建一些方法来执行一些休息调用,并且在响应中我需要在将值返回给 Javascript 之前进行一些计算。