我遇到了一些问题,我不知道该怎么办。
我正在运行 Qt 4.8.6、Qt creator 3.3.2、Ubuntu 12.04 环境交叉编译到运行 Debian 7 内核 3.8.13 的 Beaglebone Black。
我看到的问题是这段代码:
if (qApp->hasPendingEvents())
{
qDebug() << "pending events";
}
qApp->processEvents(QEventLoop::AllEvents, 10);
根据(至少我的解释)Qt 文档没有发挥应有的作用。我希望流程事件循环最多在指定的 10 毫秒内运行。
发生的是永远不会打印 qDebug 语句。因此,我希望没有要处理的事件,并且处理事件语句的进出速度非常快。大多数情况下都是这种情况。
会发生什么(不是每次,但经常发生)qDebug 语句被跳过,processEvents 语句执行 1 到 2 秒之间的某个时间。
有什么方法可以让我深入了解流程事件中发生的事情并找出导致延迟的原因吗?
最佳答案
Qt is processing events for longer than specified for
QApplication::processEvents
call on Linux system. Is there some way that I can dig into what is happening in the process events and find out what is causing the delay?
是的,观察 Qt 源代码可能会有所帮助。源代码在 /home/myname/software/Qt/5.5/Src/qtbase/src/corelib/kernel/qeventdispatcher_unix.cpp
或附近的某个地方:
bool QEventDispatcherUNIX::processEvents(QEventLoop::ProcessEventsFlags flags)
{
Q_D(QEventDispatcherUNIX);
d->interrupt.store(0);
// we are awake, broadcast it
emit awake();
// This statement implies forcing events from system event queue
// to be processed now with doSelect below
QCoreApplicationPrivate::sendPostedEvents(0, 0, d->threadData);
int nevents = 0;
const bool canWait = (d->threadData->canWaitLocked()
&& !d->interrupt.load()
&& (flags & QEventLoop::WaitForMoreEvents));
if (canWait)
emit aboutToBlock();
if (!d->interrupt.load()) {
// return the maximum time we can wait for an event.
timespec *tm = 0;
timespec wait_tm = { 0l, 0l };
if (!(flags & QEventLoop::X11ExcludeTimers)) {
if (d->timerList.timerWait(wait_tm))
tm = &wait_tm;
}
if (!canWait) {
if (!tm)
tm = &wait_tm;
// no time to wait
tm->tv_sec = 0l;
tm->tv_nsec = 0l;
}
// runs actual event loop with POSIX select
nevents = d->doSelect(flags, tm);
似乎有系统发布的事件未被 qApp->hasPendingEvents()
考虑。然后 QCoreApplicationPrivate::sendPostedEvents(0, 0, d->threadData);
刷新那些要由 d->doSelect
处理的事件。如果我正在解决这个任务,我会尝试刷新那些发布的事件 out 或者可能意识到 flags
参数是否以及为什么具有 QEventLoop::WaitForMoreEvents
位设置。我通常要么从源代码构建 Qt,要么为调试器提供其符号/源代码的路径,以便可以深入挖掘。
附言我浏览了 Qt 5.5.1 source event processing code 但那应该与你处理的非常相似。或者该实现实际上可以是 bool QEventDispatcherGlib::processEvents(QEventLoop::ProcessEventsFlags flags)
?在实际系统上很容易找到。
关于c++ - Qt Process Events 处理时间超过指定时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37533183/