C++ QT:如何确定事件处理器是否繁忙

C++ QT:如何确定事件处理器是否繁忙,c++,qt,C++,Qt,在我当前的Qt应用程序中,我试图使用 QCoreApplication::quit(); 现在关闭应用程序需要一分钟以上的时间。我相信这是因为主窗体的事件处理器很忙。我的问题是:我是否有办法确定这可能是什么原因。以下是一些我怀疑的事情 1-排队连接。 我有很多排队的连接。也许有些联系没有得到处理 2事件循环。 可能是事件循环正在忙着做一些我不知道的事情(预期) 关于我可以做些什么来检查为什么应用程序需要这么长时间才能关闭,有什么建议吗 更新: 我尝试了QCoreApplication::has

在我当前的Qt应用程序中,我试图使用

QCoreApplication::quit();
现在关闭应用程序需要一分钟以上的时间。我相信这是因为主窗体的事件处理器很忙。我的问题是:我是否有办法确定这可能是什么原因。以下是一些我怀疑的事情

1-排队连接。 我有很多排队的连接。也许有些联系没有得到处理

2事件循环。 可能是事件循环正在忙着做一些我不知道的事情(预期)

关于我可以做些什么来检查为什么应用程序需要这么长时间才能关闭,有什么建议吗

更新:


我尝试了
QCoreApplication::hasPendingEvents()
,它返回true

没有“未”处理的排队连接,也没有“忙”的事件循环。事件循环本质上是(C++中的伪代码):

所有事件处理都是通过将一些
QEvent
发送到
QObject
来完成的。这就是事件循环所做的一切。某些事件会导致发出信号。繁忙的不是事件循环,而是在
QObject::event
和重写的实现中运行的代码!这段代码会阻止事件循环,因为当它运行时,事件循环的代码在同一个线程中,并且在调用堆栈上-它无法运行

QCoreApplication::sendEvent
QCoreApplication::notify
位于调用堆栈上时,与Qt小部件和其他对象中的信号相连的插槽中的代码将真正执行,而事件循环(a
QAbstractEventDispatcher
)位于调用堆栈的更深处,最后是它下面的一个
QEventLoop

如果代码的执行速度比添加到队列中的事件慢,则会出现问题

这个简单的例子演示了这样的代码。在实际的程序中,它当然会被“模糊化”,但问题通常会归结为:

void Class::customEvent(QEvent * ev) {
  ...
  QCoreApplication::postEvent(this, new EventFoo(...));
  ...
  QCoreApplication::postEvent(this, new EventFoo(...));
  ...
}
明确的事件发布可以用非常不同的方式表达。例如,您可以向自己发送一个信号:

void Class::mySlot() {
  ...
  emit signal1();
  ...
  emit signal2();
}

如果
signal1
signal2
都通过排队连接连接到
mySlot
,则您的应用程序将耗尽内存,因为事件队列只会增加,而不会缩小。它可能仍然有响应。

是否尝试调用
QCoreApplication::hasPendingEvents()
?它返回什么?使用一些探查器来查找延迟的来源。不要猜测是什么导致了问题,因为您将修复错误的东西。在Linux中,您有一个valgrind。调试模式下的简单暂停按钮也有助于发现错误problem@vahancho它返回true,说明如何检测具有繁忙事件循环的线程。然后,在调试器中暂停应用程序并查看堆栈跟踪上的内容是一件小事。@KubaOber sweet小程序。你是在业余时间写的吗?
void Class::mySlot() {
  ...
  emit signal1();
  ...
  emit signal2();
}