• 6237阅读
  • 5回复

debug正常 release异常 [复制链接]

上一主题 下一主题
离线weizhu
 
只看楼主 倒序阅读 楼主  发表于: 2010-02-26
各位:
    我是在linux下用qt4.6.2写了一个读取摄像头数据的程序,debug版本可以正常按预期运行,但release版本好像只读一次摄像头就完了。
大家有什么建议?
先谢过了
离线xtfllbl

只看该作者 1楼 发表于: 2010-02-26
同样问题,同求解答。
上海欢迎您
离线XChinux

只看该作者 2楼 发表于: 2010-02-26
帖代码看看
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线weizhu
只看该作者 3楼 发表于: 2010-02-27
现附上代码:

#include "mainwindow.h"
#include <QPainter>
#include <QImage>
#include <QPointF>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    this->camera = new TCamera(this);
    img = new QImage((uchar*)(camera->m_pDataBuf),800,600,800,QImage::Format_Indexed8);
    connect(this,SIGNAL(destroyed()),this,SLOT(close()));
    p.setX(0);
    p.setY(0);
    img->setColorTable(camera->colorTable);
}

MainWindow::~MainWindow()
{

}

void MainWindow::closeEvent(QCloseEvent *event)
{
    delete camera;
    event->accept();
}

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.drawImage(p,*img);
    event->accept();
    camera->m_bDataUseEnd = true;
}

class TCamera : public QThread
{
    Q_OBJECT

public:
    TCamera(QWidget *para);
    ~TCamera();

    bool writeToCamera();
    void run();


    int         m_devFd;
    unsigned long mnMapLen;
    void *rgbdata;
    QWidget*    mpParen;
    struct camera_setting cameraset;
    uchar           *m_pDataBuf;                    //原始数据缓冲区地址
    int             m_cbDataBuf;                    //原始数据缓冲区大小
    uint            m_nWidth;                    //输出图像宽度
    uint            m_nHeight;                    //输出图像高度
    uint            m_nMaxWidth;                    //当前分辨率下的最大输出图像宽度
    uint            m_nMaxHeight;                    //当前分辨率下的最大输出图像宽度
    uint            m_nBitCnt;                    //图像位深,彩色为24,灰度为8

    QVector<QRgb> colorTable;
    volatile bool   m_bExit;
    volatile bool   m_bDataUseEnd;
};

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QtGui/QMainWindow>
#include "tcamera.h"
#include <QPaintEvent>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    TCamera *camera;
    QImage *img;

    void closeEvent(QCloseEvent *event);
    void paintEvent(QPaintEvent *event);
    QPointF p;
};

#endif // MAINWINDOW_H

#include "tcamera.h"
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <sys/mman.h>

TCamera::TCamera(QWidget *para)
{
    //QRgb *cl = new QRgb[256];
    for(int i=0;i<256;i++)
    {
        //cl=qRgb(i,i,i);
        colorTable.append(qRgb(i,i,i));
    }
    mpParen = para;
    m_cbDataBuf = 0;
    m_pDataBuf = 0;
    m_cbDataBuf = 480000;
    m_pDataBuf = new uchar[m_cbDataBuf];

    mnMapLen = 1024*1024;

    m_devFd = open("/dev/usb_cRz0",O_RDWR);
    if( m_devFd < 1 ){
        qDebug("open dev error");
        return ;
    }


    if(writeToCamera()){
        rgbdata = (void*)mmap(0,mnMapLen,PROT_READ,MAP_SHARED, m_devFd,0);
        if(rgbdata == MAP_FAILED){
            qDebug("mmap camera failed.");
           return ;
        }
    }
    m_bExit = false;
    start();
}
TCamera::~TCamera()
{
    if(rgbdata != (void*)-1)
        munmap(rgbdata,m_devFd);
    rgbdata = (void*)-1;

    if (m_devFd>1){
        cameraset.START = 0xFE;
        writeToCamera();
        this->m_bExit = true;
        sleep(2);
    }
    close(m_devFd);
    m_devFd = 0;

    delete[] m_pDataBuf;
}

bool TCamera::writeToCamera(){
        int result;
        result = write(m_devFd,&cameraset,sizeof(struct camera_setting));
        if(result == -1){
                qDebug("send cmd failt.\n");
                return false;
        }else
            return true;
}

void TCamera::run(){
    fd_set rfd;
    m_bDataUseEnd = true;
    struct timeval tv;
    tv.tv_sec = 10;
    tv.tv_usec = 0;
    while(true){
        if(mpParen->isVisible())
            break;
        else if(m_bExit)
            return;
    }

    while(true){
        FD_ZERO(&rfd);
        FD_SET(m_devFd,&rfd);
        switch(select(m_devFd+1,&rfd,NULL,NULL,&tv))
        {
        default:
            if(m_bDataUseEnd){
                m_bDataUseEnd = false;
                if(FD_ISSET(m_devFd,&rfd)){
                    memcpy((void*)m_pDataBuf,rgbdata,m_cbDataBuf);
                    mpParen->update();
                }
            }
            break;
        case -1:
        case 0:
            qDebug("Exit \n");
            if(m_bExit)
                return;
            else
                break;
        }
    }

}

以上是全部代码。
顺便再问下:我把图像数据直接写到fb中图像显示正常,而在paintEvent中显示时,图像的下半部分数据好像就有问题了,又是什么原因。
离线weizhu
只看该作者 4楼 发表于: 2010-03-01
来看看啊
离线weizhu
只看该作者 5楼 发表于: 2010-03-01
解决了,低级错误,冒汗...
快速回复
限100 字节
 
上一个 下一个