QT开发中文网

Qt多线程任务200ms内没返回值,就采用默认值

如果你想在任务执行超过一定时间后采用默认值,可以使用QFutureQFutureWatcher来实现。下面是一个示例代码:

#include <QCoreApplication>
#include <QtConcurrent/QtConcurrent>
#include <QDebug>
#include <QTimer>

QString defaultResult = "Default Value"; // 默认值

// 定义任务函数
QString taskFunction()
{
    qDebug() << "Running task...";
    QThread::msleep(2000); // 模拟耗时操作
    qDebug() << "Task completed.";
    return "Task Result";
}

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

    // 启动任务
    QFuture<QString> future = QtConcurrent::run(taskFunction);

    // 设置定时器,在指定时间后检查任务是否完成
    QTimer timer;
    int timeoutDuration = 200; // 超时时间(毫秒)
    timer.setSingleShot(true);
    timer.start(timeoutDuration);

    QFutureWatcher<QString> watcher;
    
   QObject::connect(&watcher, &QFutureWatcher<QString>::finished, [&]() {
        if (timer.isActive()) {
            timer.stop();
            QString result = watcher.result();
            qDebug() << "Task returned result:" << result;
        }
   });

   QObject::connect(&timer, &QTimer::timeout, [&]() {
       if (!future.isFinished()) {  // 如果任务还没有完成,则采用默认值
           future.cancel();  // 取消任务
           qDebug() << "Task timed out. Using default value:" << defaultResult;
       }
   });

   watcher.setFuture(future);

   return app.exec();
}

在这个示例中,我们使用QtConcurrent::run()来启动一个后台任务,并返回一个QFuture对象。然后,我们创建了一个QFutureWatcher对象,连接了其finished()信号以及定时器的超时信号。

当任务完成时,会触发QFutureWatcherfinished()信号槽函数,并在该槽函数中检查定时器是否仍处于活动状态。如果是,则停止定时器并获取任务的结果。

当定时器超时时,会触发定时器的超时信号槽函数。在该槽函数中,检查任务是否已经完成。如果没有完成,则取消任务,并输出默认值。

请确保在合适的位置使用合适的线程同步机制(如互斥锁)以保证数据访问的安全性。

这只是一个简单示例,你可以根据自己的需求进行修改和扩展。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=9232

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?