c++ - Qt Process Events 处理时间超过指定时间

标签 c++ qt qt4

我遇到了一些问题,我不知道该怎么办。

我正在运行 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/

相关文章:

c++ - 从同一个文件中读取字符串和整数

c++ - 无法解析符号 vector

c++ - Qt Parent 在 child 关闭后删除变量

qt - 单击关闭按钮后取消关闭 QWidget

c++ - 获取双击项目的ID

c++ - 向 Qt 对话框添加最小化按钮?

c++ - 如何从静态类函数初始化静态类对象

C++:char** 到 const char** 的转换

qt - 有什么办法可以延迟Qt QEvent吗?

c++ - 如何将 TouchPoints 列表从 QML 传递到 C++?