问题标签 [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 投票
2 回答
77 浏览

c++ - 如何获取从无关信号传递到插槽的值?

我有一个用于请求数据的异步调用的信号/插槽安排。通常这很好,因为接收到的数据只是更新控件。但在某些情况下,我必须等待对请求的回复以确保操作完成,然后再进行下一步。每次有效接收数据排队时都会触发一个信号。

还需要阻塞写入,但读/写机制几乎相同。

以下使用本地事件循环的代码模式(我相信)是等待信号的标准模式。

但是信号是用额外的数据发送的,在这种情况下是地址和其他东西。

我需要检查信号是否与请求相关联,否则我可能会过早地继续下一步。

当接收槽不知道如何处理它时,我如何接收额外的(地址)数据,因为在这种情况下,槽是一个事件循环(或计时器)。

我真的必须继承 QEventLoop 还是有更简单的方法?

以下是一个稍微简化/人为的示例。

0 投票
1 回答
100 浏览

c++ - How to avoid races if a signal is emitted before calling QObject::connect()?

In Qt, how does one avoid race conditions if signals can be emitted around the same time when I connect to them?

Consider the following naïve example:

Since fooSignal is emitted from another thread, the choice of possibilities 1-3 is realized non-deterministically by the scheduler at runtime. While the desired behavior would only be achieved in the third case, in the remaining two we lose the signal, likely leading to a deadlock or some other undefined behavior.

Does Qt offer some atomic mechanism to temporarily pause signals from objects? I'm aware of QObject::blockSignals(), however my understanding is that this suppresses signals entirely rather than just postponing them for a while.

Thank you in advance!

0 投票
1 回答
205 浏览

python - Qt Dialog窗口关闭时如何终止QEventLoop

为了获得更多使用 Python 和创建 GUI 的实践经验,我决定创建一个抽认卡测验应用程序。最初,我创建了一个接受 csv 文件名的简单函数,将答案和问题打乱,并实现了一个for循环来要求用户为每个问题输入答案。我通过 CMD 运行它,它运行良好。

接下来,我使用 Qt 设计器创建了一个简单的 Qt Dialog 窗口,带有一个textBrowser用于输出和一个lineEdit用于输入。(旁注:我知道你不应该修改生成的 ui 文件,所以我复制了代码并将其保存到不同的目录中,以便我可以安全地使用它。)我将测验功能放在 Dialog 类中,并让它调用应用程序的执行。但是,为了等待用户输入输入,我需要QEventLoop在提出问题后启动并在lineEdit.returnPressed触发时退出的测验功能中添加一个。如果我循环浏览整副纸牌,洗牌功能就会完成,当我关闭 GUI(通过 X 按钮)时,代码会定期停止。但是,如果我尝试关闭一个问题被问到和被回答之间的窗口(而QEventLoop正在运行),GUI 关闭但功能仍在运行,并且aboutToQuit我设置的检测器没有被触发。

我很确定这个问题是因为测验功能QEventLoopQEventLoop 执行. 让窗口和QEventLoop运行同步解决我的问题吗?QEventLoop在函数的窗口关闭等事件的情况下,有没有办法过早地突破?还是我应该使用像QTimer这里这样的不同流程?

0 投票
2 回答
172 浏览

qt - QEventLoop 没有同步等待 QNetworkReply 完成

我正在使用 Qt 构建一个调用服务器的库,我需要构建一个等待 HTTP 响应(QNetworkReply 对象)的同步函数,并且我正在使用 QEventLoop 来实现这一点。当前服务器被调用,但循环不等待回复完成,而是继续使用一个空的 QNetworkReply 对象。

完全相同的函数在我构建的一个简单测试项目中工作,该项目仅包含一个线程和从 main 对该函数的调用。等待回复,一切都按预期工作。但是在我的包含多个线程的项目中,会发生上述场景并且事件循环不等待回复。请求被发送到服务器并显示在那里,但响应无法返回到 QNetworkReply 对象,因为该函数已经执行。

这是我的功能的网络部分。在我的项目中,statusCode 变量始终为 0 并且回复为空,但在简单的测试场景中,它们为 200 和预期的 HTTP 响应。

0 投票
0 回答
99 浏览

qt - QEventLoop::wakeUp() 的目的是什么?

我正在使用自定义事件处理QEventLoop::processEvents()来使一些代码同步...我QEventLoop::wakeUp()在文档中看到:

唤醒事件循环。

对我来说似乎太少了。实际上做了什么QEventLoop::wakeUp(),我应该什么时候调用它?

0 投票
0 回答
80 浏览

c++ - Qt 中是否有基于事件循环而不是线程阻塞的信​​号量?

信号量或互斥体的线程阻塞通常会导致程序卡顿,我宁愿拥有一个基于 QEventLoop 的线程阻塞,因为这样不会停止线程。

这是否已经存在,特别是对于信号量,还是我需要创建自己的类来实现它?谢谢。

0 投票
1 回答
78 浏览

python - QAxWidget 实例中的 QEventLoop 失败

我正在使用 Windows OCX api 开发基于终端的 PyQt 应用程序。而且我在 QAxWidget 实例中实现(调用 exec)QEventLoop 时遇到了麻烦。

如果我在主 QApplication 主循环中调用 exec() ,一切都很好。但是,在主循环中实例化的 QAxWidget 实例中调用 exec() ,它不能按预期工作。

当 exec() 调用(代码中的_on_event_connect)时,错误消息显示为

在调用 exit() 的那一刻,QEventLoop 似乎没有运行。并且应用程序在此之后挂起。

下面是我的代码的简化示例,它会在登录过程完成后立即调用 QAxWidget 方法“dynamicCall”。它由 pyQt 信号/槽机制组成,从 API 服务器获取事件。请理解您无法执行此代码,因为它需要特定的 API 安装和注册用户 ID。但我希望你能看到问题所在。

主文件

api.py

输出如下。


正如 eyllanesc 告诉我的那样,我更改了与分配/取消分配 QEventLoop 相关的函数,如下所示。它有效。


更新

恐怕这个问题还没有解决。在 _on_event_connect 事件上调用 req_basic_stock_info 函数时成功,但我在另一个事件函数中调用它,它再次挂起而没有任何错误消息。调用机制没有区别。

0 投票
1 回答
36 浏览

c++ - QObject 子类未检测到 QGuiApplication 事件循环

当我尝试在从 QObject 派生的类中启动 QTimer 时,我收到警告

QObject::startTimer:定时器只能用于以 QThread 启动的线程

并且计时器不运行。根据此处的回答,我的自定义类似乎没有检测到由 QGuiApplication 创建的 QEventLoop。

我的 main.cpp

我的课A.h

我的classA.cpp

如何在不创建新 QEventLoop 的情况下解决此问题?

0 投票
0 回答
40 浏览

c++ - 如何在 QT C++ 中等待另一个窗口关闭?

我有一个窗户。当我按下一个按钮时,它会执行一个功能。该功能在某些时候可能会启动另一个窗口。在那个窗口中,用户可以做一些事情。当那个窗口打开时,我没有使用另一个窗口。

所以这是我试图实现的目标:

我正在使用QEventLoop在第二个窗口打开时执行它的操作。一旦我关闭另一个窗口,第一个窗口会弹出一秒钟,并在完成当前功能后关闭。我希望它完成当前功能,然后继续显示窗口,以便可以用它完成其他事情。try-catch 块不捕获任何东西。可能是什么问题,我该如何解决?还是有更好的方法让我让主线程在继续之前等待另一个窗口完成?

0 投票
0 回答
62 浏览

c++ - 有没有办法在 QML 应用程序中使用 QEventLoop 作为主事件循环?

QML 应用程序在使用 QEventLoop 时不会退出。窗口会正常打开,但是当应用程序窗口关闭时,程序不会退出。它也不会触发任何事件,例如QGuiApplication::lastWindowClosedor QQmlApplicationEngine::destroyed。尝试运行下面的示例以了解我的意思。您必须按 CTRL-C 才能退出。

有没有办法在 QML 应用程序中使用 QEventLoop 作为主事件循环?

注意:是的,我确实需要使用 QEventLoop 作为主事件循环。qGuiApp->exec()有效,但这不是我需要的。