QT 多线程

QtConcurrent 应用 

#include "QDebug"
#include "QThread"
#include "QTimer"
#include "QtConcurrent/QtConcurrent"
#include "QRunnable"


void myclass::RDPrintf(QString str)
{
    int io=0;
    while( 9 ) {
        qDebug()<<"DPrintf"<<str<<QDateTime::currentMSecsSinceEpoch();
        for(io=0;io<1000000;io++);
        QThread::msleep(1);
 
//直接调用this->ui->label->setText会出错,因不同线程 ,只能用 QMetaObject::invokeMethod 方法
//this->ui->label->setText(QString::asprintf("Thread %ld",QDateTime::currentMSecsSinceEpoch()));
 
QMetaObject::invokeMethod( this->ui->label, "setText",
                                   Q_ARG(QString, QString::asprintf("Thread %ld",QDateTime::currentMSecsSinceEpoch())) );

    }
}

 
long DPrintf(QString str)
{
        qDebug()<<"DPrintf"<<str<<QDateTime::currentMSecsSinceEpoch();
        return QDateTime::currentMSecsSinceEpoch();
}


 
......
    QThreadPool *pool = new QThreadPool;
    pool->setMaxThreadCount(100);
    for(int i=0;i<100;i++) {
        //   QFuture<void> fut1 =
//非类方法调用。
QtConcurrent::run( pool, ::DPrintf, QString::asprintf("Thread %0.2d",i) );
// 调用类方法时,被调用的方法不能更新UI,如果更新UI会出现异常,因UI更新线程与之为不同线程
// 更新UI可以通过 QMetaObject::invokeMethod
        QtConcurrent::run( pool, this, myclass::RDPrintf, QString::asprintf("Thread %0.2d",i) );
    }
......

......
 
    QFuture<long> tef = QtConcurrent::run(::DPrintf, QString("Thread 2"));
    tef.waitForFinished(); //等线程结束并返回值
    qDebug()<<"tef"<<tef.resultAt(0)<<tef.result();
...... 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值