我有创建和管理GUI内容的GUI线程。现在,当应用程序空闲时,即所有线程都空闲(或者即使只有 GUI 线程空闲),我希望我继承的类的对象发出. 因此,每当应用程序空闲时,我都会默默地创建下一阶段所需的内容。所以我想知道如何让该对象在GUI线程空闲时发出一个?我的应用程序是多线程的并且有多个类,因此不必仅在GUI类中发出。还有QMainWindow
SIGNAL
Widgets
SIGNAL
SIGNAL
SIGNAL
不应在线程空闲时立即发出。我希望线程应该空闲足够长的时间,以便我确定用户实际上是空闲的。谢谢你!
问问题
6611 次
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;
};
主.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 回答