问题标签 [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 回答
284 浏览

events - pyside - 有没有办法获取事件循环中每个事件的日志信息?

我正在使用 PySide 开发一个应用程序,我想知道是否有一种方法可以记录哪些事件进入主事件循环以及哪些事件离开。我的应用程序不使用线程,它是完全异步的,但我想拥有事件循环的日志注册表以用于调试目的。我logging用作我的日志记录工具(duh)。

Pax et Bonum。

0 投票
2 回答
1033 浏览

c++ - 将多个 QTimers 调用排队到插槽

我正在使用一个库,我需要调用一个触发函数来启动一些处理(启动一个执行该工作的线程)并立即返回。然后,当处理完成时,会发出一个信号。

这需要根据不同的参数定期进行。由于在处理过程中不能对触发函数进行其他调用,因此我需要以某种方式对它们进行排队。我考虑过使用 QEventLoop (“循环”),但到目前为止还没有运气。

请看这段代码:

问题是在处理过程中调用 loop.exec() 时,我收到以下消息:

做我想做的事情的正确方法是什么?

提前致谢。

0 投票
1 回答
249 浏览

qt - 使用 QNetworkAccessManager::authenticationRequired 和自己的输入小部件/异步

我目前正在开发一个带有类似 vim 输入栏的 Qt 浏览器:

状态栏示例

这基本上只是一个QHBoxLayout带有 aQLineEdit和一些QLabels 的 a 。

现在我想处理 HTTP 身份验证。我在其他项目中看到的通常情况是打开一个模式QDialog,然后exec()在连接到authenticationRequired 信号的插槽内调用它。

现在我想使用相同的状态栏向用户询问身份验证信息,即显示一些提示,然后使用 QLineEdit 输入信息。

我的问题是 authenticationRequired 插槽块,我不能简单地继续在主循环中运行并在用户完成后继续请求并添加身份验证信息。

我想过两种解决方案:

  • 实现一些函数,在调用时从状态栏获取值,而QCoreApplication::processEvents用户还没有回复。但是我不确定这是否是个好主意,以及应用程序是否会占用大量 CPU 直到我回到真正的事件循环。

  • 以某种方式保存和中止请求,要求用户进行身份验证,然后在添加身份验证信息后立即重新创建请求。但似乎我不能简单地克隆 aQNetworkReply然后调用abort()原始回复并稍后恢复。

看看是如何QDialog::exec() 实现的,他们似乎创建了一个QEventLoop带有未记录值的新值QEventLoop::DialogExec。我想知道我是否可以做同样的事情,但是我不确定一旦有用户输入,我将如何退出事件循环。

这些想法中哪一个听起来最理智?

0 投票
1 回答
2488 浏览

c++ - 关于 QThread、QObject、线程关联和事件循环的混淆

我正在浏览链接

  1. 你这样做是不对的
  2. 以正确的方式使用 QThread 第 1 部分
  3. 以正确的方式使用 QThread 第 2 部分

我被一些陈述弄糊涂了。在第一个链接中,它说

QThread 中的所有函数都是编写的,旨在从创建线程调用,而不是从 QThread 启动的线程调用。

虽然它建议使用moveToThread将对象移动到新线程,而不是子类化QThread。我的问题是:

run方法调用的默认实现exec,它创建了一个事件循环,当一个对象的线程亲和性发生改变时moveToThread,所有的slots都将在新线程中执行,而不是在创建线程上,这与上述预期用途相矛盾。我错过了什么吗?

第二个问题:

在第三个链接中说

事件队列属于线程而不是事件循环,它被运行在该线程中的所有事件循环共享。

我的问题是如何在单个线程中有多个事件循环?我的理解是,事件循环循环通过event-queue,直到exit/terminate被调用,并处理每个event到达该队列。如果这是真的,一个循环将永远不会结束(除非 exit/terminate被调用),另一个循环如何开始?任何演示它的示例代码都将受到高度赞赏。

0 投票
1 回答
3180 浏览

c++ - 如何在不阻塞主线程的情况下使用 Qt-Dbus 绑定

我的目标是使用Qt 的 DBus bindings创建一个库。

我试图创建一个 Qt 应用程序而不在主线程中启动QEventLoop(由类提供)。QCoreApplication

这是一个简约的应用程序示例,使用 QT-4.6.2 版本可以正常工作,但使用 QT-4.8 或更高版本阻止自省。

DBusHandler.hpp

主文件

正如您在main.cpp文件中看到的,app.exec()被注释掉了,但使应用程序在 QT-4.8 或更高版本 (5.3.0) 上运行良好。

我的问题如下:是否可以在 Qt-4.8 或 5.3 上的主线程之外的app.exec()其他线程中使用 Qt 的 DBus 绑定调用?

0 投票
1 回答
90 浏览

c++ - 循环处理和删除 QThread

我有一个从 QThread 继承的类(我们称之为 ClassA),它在 for 循环中运行,如下所示:

问题是类包含大量内存,并且在循环仍在运行时它似乎没有被破坏。所以程序会在内存建立后很快崩溃(如内存泄漏)。我也尝试使用“删除类”,这当然会使程序崩溃。

任何人都知道如何在循环中正确运行和删除这样的类,这样它就不会不断地占用内存。

for 循环也位于另一个线程中。所以有一个线程层次结构,其中事件循环可能是调用 deleteLater() 的关键?代码写起来有点太复杂,但我想要的最快答案可能是如何在线程环境中正确删除 Qthread 对象(即正确使用 eventloop),因此没有内存泄漏(或者更像是内存构建为Qthread 对象没有被删除)

0 投票
3 回答
3761 浏览

c++ - Qt:调用 QEventLoop::exec 后出现死锁

我有一个相当简单的应用程序,当我调用 QEventLoop::exec 时,它似乎在某些条件下死锁。应用程序在两种情况下调用此函数:

  • 当某些数据到达套接字时
  • 在计时器事件上

在这两种情况下,它都在以下上下文中使用(只是一个 http 查询,没什么特别的):

以下是它尝试调用它时发生的情况:

可以看到,它没有等待 HTTP 请求的响应,而是选择了另一个事件并开始处理它。结果,在我的应用程序停止之前,我在当前线程中获得了大量帧(746),然后我看到如下行:

谁能解释一下我在这里做错了什么?

0 投票
1 回答
2218 浏览

c++ - Qt从其他线程添加函数调用到事件循环

我偶然发现了一个我现在无法以优雅的方式解决的问题。情况:我有一个从我的应用程序外部调用的回调函数。回调函数必须更新一些 gui 对象。由于我不能repaint()从另一个线程中调用(例如),我必须找到一些方法来向主事件循环添加函数调用,以便任务在某个时间执行.

一种可能的方法是使用它:

但是,这只是给我的回应no such Method "Object::functionName"。(这显然是一个谎言!)

我还阅读了有关将信号连接到插槽的信息,该插槽将通过将连接类型设置为从事件循环中调用Qt::QueuedConnection。但是,使用QOjbect.:connect()不起作用,因为我不知道信号需要获取哪个对象。尼斯会是这样的

QObject::emit(object, SIGNAL(function(flaot)), arg);

0 投票
1 回答
1221 浏览

qt - 手动重新启动计时器后奇怪的未记录 QTimer/QEventLoop 行为

我最近在使用调用具有内部 QEventLoop 的函数的 QTimer 时偶然发现了这一点

所以,假设我们有一个 QTimer 实例

我们在构造函数的某个地方启动它,它每 100 毫秒开始计时一次

现在是有趣的部分,我们将它连接到具有内部 QEventLoop 的插槽

抛开这个循环有多愚蠢,我们看到我们永远不会完成对插槽的处理,并且计时器的后续超时将继续堆积到执行队列中。一切都很好,应该是这样。

接下来不应该出现的情况是:由于 QEventLoop 确保我们的应用程序在插槽无意识地闲置时保持响应,我们可以制作一个按钮及其 clicked() 插槽,如下所示:

我在这里所做的基本上是重新启动当前的计时器周期,仅此而已。对?没有!重新启动后,SlotFunction再次触发,表明计时器重新启动后的滴答实际上并不等于在它之前发出的所有其他滴答...

我唯一的问题是:WTF?!为什么手动重新启动计时器可以使其进入插槽附加时间?我在freenode上问过,但我得到的唯一答案是“它应该是”

0 投票
1 回答
3391 浏览

c++ - 是否可以在不调用 QApplication::exec() 的情况下创建本地事件循环?

QTcpServer我想创建一个库,QTcpSocket用于在其函数中没有事件循环的程序之上main(因为 Qt 事件循环是阻塞的,并且没有为所需的实时操作提供足够的时序分辨率) )。

app->exec()我希望通过在类中创建本地事件循环来解决这个问题,但除非我先调用主函数,否则它们似乎不起作用。是否有某种方法可以创建本地事件循环并允许线程内的信号/插槽通信而无需应用程序级事件循环?

我已经看过Is there a way to use Qt without QApplication::exec()? 但答案无济于事,因为该解决方案似乎添加了一个本地事件循环,但没有删除应用程序循环。