Qt Process Events处理时间超过指定时间

时间:2016-05-30 20:22:55

标签: c++ qt qt4

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

我正在运行Qt 4.8.6,Qt创建者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毫秒内为AT MOST运行。

从未打印过qDebug语句会发生什么。我希望因此没有事件需要处理,并且进程事件语句很快进出。大部分时间都是这种情况。

跳过qDebug语句会发生什么(不是每次,但经常都会),并且processEvents语句执行的时间介于1到2秒之间。

是否有某种方法可以深入了解流程事件中发生的事情并找出导致延迟的原因?

1 个答案:

答案 0 :(得分:0)

  

Qt处理事件的时间超过了Linux上QApplication::processEvents调用的指定时间   系统。有什么方法可以深入了解正在发生的事情   处理事件并找出导致延迟的原因?

是的,观察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,要么为调试器提供其符号/源的路径,以便可以深入挖掘。

P.S。我查看了Qt 5.5.1源事件处理代码,但这应该与您处理的内容非常相似。或者该实现实际上可能是bool QEventDispatcherGlib::processEvents(QEventLoop::ProcessEventsFlags flags)?在实际系统上很容易找到。