您的位置:首页 > 其它

关于label显示另一个线程发来的图片的问题

2017-03-06 15:32 465 查看
情景在现:

thread A:从摄像头获取图片不断的发送给主线程去显示

void CCamWorker::captureLoop(void) {
int r=0;
int trygetcnt = 0;
qDebug()<<QThread::currentThread()<<__FUNCTION__;
if(!thread->isRunning())
AnnReturnNone("video thread is no exist.");
streamOn();
sleep(2);
workstatus = CAPTURING;
QReadLocker locker(&datalock);
locker.unlock();
QPixmap pic;
while(CAPTURING==workstatus)
{
r = readFrame(5);
if(-1==r)
{
if(trygetcnt++ > 1)
{
emit resultReady(pic);
break;
}
streamOff();
streamOn();
}
else
{
trygetcnt = 0;
locker.relock();
bool ret = pic.loadFromData((uchar *)img.pfile,img.size);
locker.unlock();
if(ret&&!pic.isNull())
{
emit resultReady(pic);
}
}
}
streamOff();
workstatus = QUITED;
}


main thread :图片的显示。

connect(this,SIGNAL(resultReady(QPixmap))\
,this->label,SLOT(setPixmap(QPixmap)));


result
在电脑上能正常显示,可到了板子上只能显示第一张图,后续的图不显示了。代码运行是正常的,无错。

处理

开始的笨办法是直接把LABEL指针传给分线程,处理显示都在分线程中。由于这样做不是很稳定,后期优化我就试着回到分线程处理,主线程显示的道路上来了。

在直接发送pic的过程中可能出现问题,具体什么我自己也忘了,当时解决了就没管了,应该是如果你在显示图片的方法中加了其它处理导致时间太长,那么分线程上的pic可能又在加载就会导致出现问题。

后来我在做优化时要显示局部图像,因此使用了COPY,这下突然之间板子上也能正常显示图片了!!!!太惊奇了,不理解问题的原因所在。

在发送图片之前做如下处理

if(ret&&!pic.isNull())
{
QPixmap tmppic = pic.copy(view_rect.x,view_rect.y,view_rect.width,view_rect.height);
emit resultReady(tmppic);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: