2013-02-15 45 views
7

我有图形用户界面创建的线程&管理图形用户界面内容。现在当应用程序空闲时,即所有线程都空闲(或者即使只有GUI线程空闲),那么我希望我的继承类的对象发出SIGNAL。因此,无论何时应用程序闲置,我都会默默创建下一阶段所需的Widgets。所以我想知道如何让这个对象发出一个SIGNAL只要GUI线程空闲?我的应用程序是多线程 &有多个类别,因此SIGNAL不是必须仅在类别GUI中发出。 一旦线程变为空闲状态,不应该立即释放SIGNAL。我希望线程应该闲置足够的时间,以便我确信用户实际上是空闲的。 谢谢!发出SIGNAL信号?

+2

看到这个答案 - http://stackoverflow.com/a/6534069/667266 – borisbn 2013-02-15 11:56:36

回答

11

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()槽只要事件循环进入空闲状态。将工作分解为小卡盘不会阻止循环,应用程序将保持响应。

+0

谢谢你的答复! – 2013-02-17 11:35:00