QT QThread 串行执行,不并行执行的原因

最近写了一个QT的多线程程序,但打印出来的时间看,是串行执行,并未并行执行,纠结了好久才发现是QThread 用错了,特此记录下

源代码:

myDialog::myDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::myDialog)
{

    pThread1 = new PicThread(this);
    pThread1->SetData(frame,p,&len,1,picBuffer);
    pThread1->VideoInit(CAMONE);
    pThread1->start();
//void SetData(QImage * pFrame, uchar* pPic, uint *length, uint picLocation,uint* picLocaBuffer)

    pThread2 = new PicThread(this);
    pThread2->SetData(frame1,p1,&len1,2,&picBuffer[SOUWIDTH*SOUHIGH]);
    pThread2->VideoInit(CAMTWO);
    pThread2->start();

    pThread3 = new PicThread(this);
    pThread3->SetData(frame2,p2,&len2,3,&picBuffer[SOUWIDTH*SOUHIGH*2]);
    pThread3->VideoInit(CAMTHR);
    pThread3->start();

}

thread函数:


void PicThread::run()
{

timer = new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(GetFrame()));
    timer->start(40);
    while(1)
    {
        sleep(10);
    }
}


bool PicThread::GetFrame()
{
    qDebug() << "devNum begin:" << vedioNum << "   " << QDateTime::currentDateTime().toString("hh:mm:ss.zzz");

    vd->get_frame((void **)&p,len);
    //frame->loadFromData((uchar *)p,/*len*/SOUWIDTH * SOUHIGH * 4 * sizeof(char));
    frame->loadFromData((uchar *)p,*len);

    vd->unget_frame();
    qDebug() << "devNum :" << vedioNum << " " << frame->byteCount() << "   " << *len << "   " << QDateTime::currentDateTime().toString("hh:mm:ss.zzz");
    return true;
}

 

打印出来的时间是这样的

devNum begin: 1     "14:24:09.096"
devNum : 1   1228800     614989     "14:24:09.104"
devNum begin: 3     "14:24:09.104"
devNum : 3   1228800     614989     "14:24:09.113"
devNum begin: 5     "14:24:09.113"
devNum : 5   1228800     614989     "14:24:09.119"
devNum begin: 1     "14:24:09.194"
devNum : 1   1228800     614989     "14:24:09.201"
devNum begin: 3     "14:24:09.201"
devNum : 3   1228800     614989     "14:24:09.208"
devNum begin: 5     "14:24:09.208"
devNum : 5   1228800     614989     "14:24:09.213"

从时间可以看出是线程串行执行,而不是并行执行。后来把线程修改如下

void PicThread::run()
{
    while(1)
    {

      GetFrame();
        sleep(10);
    }
}

 

则时间并行执行。

具体原因如下

 

 run函数中包含的代码会运行于一个单独的线程,而非run函数包含的代码,则运行于主线程,因此串行执行

 run函数中包含的代码会运行于一个单独的线程,而非run函数包含的代码,则运行于主线程,因此串行执行

 run函数中包含的代码会运行于一个单独的线程,而非run函数包含的代码,则运行于主线程,因此串行执行

重要的事情说三遍

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值