我有用于创建和管理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/