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

  1. 情景在现:
    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)));
  2. result
    在电脑上能正常显示,可到了板子上只能显示第一张图,后续的图不显示了。代码运行是正常的,无错。
  3. 处理

    开始的笨办法是直接把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);
            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值