8

GUIコンテンツを作成および管理するGUIスレッドがあります。アプリケーションがアイドル状態のとき、つまりすべてのスレッドがアイドル状態のとき (または、GUI スレッドだけがアイドル状態の場合でも)、継承したクラスのオブジェクトに. そのため、アプリケーションがアイドル状態のときはいつでも、次の段階に必要なものを静かに作成します。GUIスレッドがアイドル状態のときはいつでもそのオブジェクトを発行する方法を知りたいですか? 私のアプリケーションはマルチスレッドであり、複数のクラスがあるため、GUIクラスのみで発行する必要はありません。また、QMainWindowSIGNALWidgetsSIGNALSIGNALSIGNALスレッドがアイドル状態になるとすぐに発行されるべきではありません。ユーザーが実際にアイドリングしていることを確認できるように、スレッドを十分な時間アイドル状態にする必要があります。ありがとう!

4

1 に答える 1

13

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

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()これにより、イベントループがアイドル状態になるとすぐにスロットへの呼び出しがスケジュールされます。作業を小さなチャックに分割してもループがブロックされることはなく、アプリケーションは応答性を維持します。

于 2013-02-15T19:59:14.647 に答える