最近写了一个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函数包含的代码,则运行于主线程,因此串行执行
重要的事情说三遍