gpt4 book ai didi

c++ - 当 GUI 线程在 Qt 中空闲时发出信号?

转载 作者:可可西里 更新时间:2023-11-01 17:37:10 33 4
gpt4 key购买 nike

我有 GUI 创建和管理 GUI 内容的线程。现在,当应用程序空闲时,即所有线程都空闲(或者即使只有 GUI 线程空闲),我希望我的 QMainWindow 继承类的对象发出一个 SIGNAL。这样,只要应用程序空闲,我就会默默地创建下一阶段所需的 Widgets。所以我想知道如何使该对象在 GUI 线程空闲时发出 SIGNAL?我的应用程序是多线程并且有多个类,因此SIGNAL 不必仅在GUI 类中发出。此外,不应在线程空闲时立即发出 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;
};

主要.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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com