2013-02-15 98 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