情景在现:
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); }
-
关于label显示另一个线程发来的图片的问题
最新推荐文章于 2024-05-05 02:34:47 发布