当GUI线程在Qt中空闲时发出SIGNAL?

Coo*_*der 8 c++ qt

我有GUI线程,可以创建和管理GUI内容.现在当应用程序空闲时,即所有线程都空闲(或者即使只有GUI线程空闲),那么我希望我QMainWindow继承的类的对象发出一个SIGNAL.因此,每当应用程序处于空闲状态时,我将默默地创建Widgets下一阶段所需的内容.所以我想知道如何SIGNALGUI线程空闲时让该对象发出一个?我的应用程序是多线程的并且具有多个类,因此不必仅SIGNALGUI类中发出.另外,SIGNAL不应该被尽快线程变为空闲发出.我希望线程应该空闲足够长的时间,以便我确信用户实际上是空闲的.谢谢!

div*_*nov 12

QAbstractEventDispatcher允许用户将自己的事件插入到Qt的事件循环中.它还允许监视事件循环的工作负载.

这是一个例子.小部件正在侦听QAbstractEventDispatcher :: awake()和QAbstractEventDispatcher :: aboutToBlock()信号,以了解事件循环何时繁忙.

#include <QtGui>

class IdleAwareWidget : public QWidget
{
    Q_OBJECT

public:
    IdleAwareWidget(QWidget *parent = 0) : QWidget(parent) {
        dispatcher = QAbstractEventDispatcher::instance();
        connect(dispatcher, SIGNAL(awake()), SLOT(awake()));
        connect(dispatcher, SIGNAL(aboutToBlock()), SLOT(aboutToBlock()));
    }

private slots:
    void awake() {
        lastAwake = QTime::currentTime();
        qDebug() << "Slept for " << lastBlock.msecsTo(lastAwake) << " msec";
    }

    void aboutToBlock() {
        lastBlock = QTime::currentTime();
        qDebug() << "Worked for " << lastAwake.msecsTo(lastBlock) << " msec";
    }

private:
    QAbstractEventDispatcher *dispatcher;
    QTime lastAwake;
    QTime lastBlock;
};
Run Code Online (Sandbox Code Playgroud)

main.cpp中:

#include <QtGui>

#include "idle_widget.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    IdleWidget widget;
    widget.show();

    return a.exec();
}
Run Code Online (Sandbox Code Playgroud)

如果问题只是关于空闲处理,那么带有0间隔的QTimer是一个选项:

QTimer::singleShot(0, this, SLOT(doWorkInIdle()));
Run Code Online (Sandbox Code Playgroud)

doWorkInIdle()一旦事件循环进入空闲状态,这将调度对插槽的调用.拆分工作到小夹头不会阻止循环,应用程序将保持响应.