我有用于创建和管理GUI内容的GUI线程。现在,当应用程序处于空闲状态时,即所有线程都处于空闲状态(或者即使只有GUI线程处于空闲状态),我也希望QMainWindow继承类的对象发出SIGNAL。这样,每当应用程序空闲时,我都将静默创建下一个阶段所需的Widgets。因此,我想知道每当GUI线程空闲时如何使该对象发出SIGNAL?我的应用程序是多线程的,并且具有多个类,因此没有必要仅在GUI类中发出SIGNAL
而且,线程变为空闲后,不应立即发送SIGNAL。我希望线程应该空闲足够的时间,以便确保用户实际上在空闲。
谢谢你!

最佳答案

QAbstractEventDispatcher允许将自己的事件插入Qt's event loop。它还允许监视事件循环的工作量。

这是一个例子。小部件正在监听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;
};

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();
}

如果问题仅在于空闲处理,那么可以选择间隔为0的QTimer:
QTimer::singleShot(0, this, SLOT(doWorkInIdle()));

一旦事件循环进入空闲状态,这将安排对doWorkInIdle()插槽的调用。将工作拆分为小卡盘不会阻塞循环,并且应用程序将保持响应状态。

关于c++ - 当GUI线程在Qt中处于空闲状态时发出信号?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14893059/

10-11 00:36