问:这个代码中的QBuffer线程安全吗?

时间:2015-01-22 12:54:21

标签: c++ multithreading qt

代码如下:

class USBCamCaptureThread : public QThread
{
Q_OBJECT

void run() {
    while (!threadQuit){
        if (imageReaded){
            buffer->reset();
            Request = http->get (url->path(),buffer););
        }
        MG::SLEEP::msleep(250);
    }
 }

public:
USBCamCaptureThread(){
    QFile file("setting_files/cameraIP.txt");
    QString line = "192.168.1.5:80"; //default value
    if(file.open(QIODevice::ReadOnly)) {
        QTextStream in(&file);
        line = in.readLine();
    } 
    file.close();
    url = new QUrl(line);
    http = new QHttp(this);
    buffer = new QBuffer(&bytes);
    threadQuit = false;
    imageReaded = true;
}

~USBCamCaptureThread(){
}

public slots:
void Finished(int requestId, bool error){
        QImage localImage;
        localImage.loadFromData(bytes);

        QImg = localImage;
        bytes.clear();

        emit signalUSBImageRead();
}

请注意, Finished()位于主线程中, run()位于工作线程中。 可能问题是通过在单独的线程中读/写 bytes buffer ,它会导致线程相关的问题吗?

1 个答案:

答案 0 :(得分:2)

如果在Finished处于活动状态时调用run,则表示您遇到问题。在管道中(串行)运行的两个线程之间共享数据不一定是个问题。同时在两个线程之间访问非线程安全的共享数据始终是一个问题。我多年没有使用过Qt,所以QBufferQImage::loadFromData也可以为自己提供线程安全保障。