Qt如何将一个为一个函数单独开启一个线程,主线程不阻塞

QFutureWatcher实现在线程中调用方法

一、QFutureWatcher是什么
GPT:

QFutureWatcher类是一个可以用来监视QFuture的类,它提供了关于QFuture的信息和通知。
例如进度、状态、结果等。它可以使用信号和槽与QFuture进行交互,例如取消、暂停、恢复等。
它还可以提供节流控制,当待处理的结果信号数量超过限制时,自动减慢QFuture的计算速度。

QFutureWatcher类的基本用法是:

创建一个QFutureWatcher对象,并连接到相关的信号。
使用QtConcurrent模块中的API启动一个异步计算,并返回一个QFuture对象。
使用setFuture()函数让QFutureWatcher开始监视QFuture对象。
使用future()函数获取由setFuture()设置的QFuture对象。
使用QFutureWatcher类中的函数访问QFuture对象的信息,例如progressValue()、isFinished()、result()等。
使用QFutureWatcher类中的槽函数控制QFuture对象的行为,例如cancel()、setPaused()等。
下面是一个使用QFutureWatcher的简单示例,其中包含progressValueChanged信号:
#include <QtConcurrent/QtConcurrent>
#include <QFutureWatcher>
#include <QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    // 创建一个QFutureWatcher对象,并连接到progressValueChanged信号
    QFutureWatcher<void> watcher;
    QObject::connect(&watcher, &QFutureWatcher<void>::progressValueChanged, [](int progress) {
        qDebug() << "Progress changed:" << progress;
    });

    // 启动一个异步计算,并返回一个QFuture对象
    QFuture<void> future = QtConcurrent::run([]() {
        for (int i = 0; i < 100; i++) {
            QThread::msleep(100); // 模拟一些工作
            if (i % 10 == 0) {
                // 发送一个自定义事件,以便在UI线程中更新进度条
                QCoreApplication::postEvent(&watcher, new QEvent(QEvent::User));
            }
            // 设置进度值
            watcher.setProgressValue(i);
        }
    });

    // 让QFutureWatcher开始监视QFuture对象
    watcher.setFuture(future);

    return app.exec();
}

二、QFutureWatcher类用法
.pro

QT += concurrent
// An highlighted block
var foo = 'bar';

.h

#include <QFutureWatcher>

class FutureWatcherTest: public QObject
{
public:
    FutureWatcherTest();
    ~FutureWatcherTest();
	
	QFutureWatcher<bool> Watcher;

private slots:
    void SlotHandleFinished();//结果处理槽
}

	
//res函数执行结果,bool为结果数据类型	
QFuture<bool> res = QtConcurrent::run(&m_PosService,&xxfunciton所在类::xxfunction,xxfunction参数1,xxfunction参数2,...3,....4);
Watcher.setFuture(res);

.cpp

FutureWatcherTest::FutureWatcherTest()
{
	connect(&Watcher, &QFutureWatcher<bool>::finished, 
			this, &FutureWatcherTest::hkSlotHandleFinished);
}
	
void SlotHandleFinished()
{
    // 获取QFuture对象的结果
    bool res = Watcher.result();
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Qt的信号槽机制实现线阻塞直到某一个信号到来的效果。 具体实现方式如下: 1. 在线程中使用一个QWaitCondition对象来实现线程的阻塞,等待信号的到来。 2. 在需要等待信号的地方,使用QMutexLocker对象锁定一个互斥量,然后调用wait()函数,使线程进入等待状态,等待信号的到来。 3. 当信号到来时,调用QWaitCondition对象的wakeOne()函数来唤醒等待的线程。 4. 在线程的run()函数中,使用一个无限循环来不断地等待信号的到来,直到线程结束。 以下是示例代码: ```cpp class MyThread : public QThread { public: MyThread(QObject* parent = nullptr) : QThread(parent) { connect(this, SIGNAL(signal()), this, SLOT(handleSignal())); } void run() override { QMutexLocker locker(&m_mutex); while (!m_quit) { m_waitCondition.wait(&m_mutex); } } void stop() { QMutexLocker locker(&m_mutex); m_quit = true; m_waitCondition.wakeOne(); } void emitSignal() { emit signal(); } private slots: void handleSignal() { QMutexLocker locker(&m_mutex); m_waitCondition.wakeOne(); } signals: void signal(); private: QMutex m_mutex; QWaitCondition m_waitCondition; bool m_quit = false; }; ``` 在上面的示例代码中,MyThread类继承自QThread类,重写了run()函数。在run()函数中,使用一个无限循环来等待信号的到来,直到线程结束。在handleSignal()函数中,调用QWaitCondition对象的wakeOne()函数来唤醒等待的线程。在stop()函数中,设置退出标志,并唤醒等待的线程。在emitSignal()函数中,发射信号,触发handleSignal()函数的执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值