c++ - Qt:这段代码中的QBuffer线程安全吗?

标签 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() 在工作线程中。 可能的问题是在单独的线程中读取/写入 bytesbuffer 会导致线程相关问题吗?

最佳答案

如果 Finishedrun 处于事件状态时被调用,那么是的,您遇到了问题。在管道中(串行)运行的两个线程之间共享数据不一定是个问题。同时访问非线程安全的、两个线程之间的共享数据总是一个问题。我已经很多年没有使用 Qt 了,所以 QBufferQImage::loadFromData 也可能提供它们自己的线程安全保证。

关于c++ - Qt:这段代码中的QBuffer线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28089312/

相关文章:

java - 如何在 JFrame 退出时运行终止命令?

c++ - 将 Vector 转换为 QJsonArray 的最快方法?

qt - 具有两个(或更多)布局的小部件

c++ - 这段代码(用于容器遍历的宏)是否有效?如果是,为什么?

c++ - 如何在超时时停止异步评估功能?

java - 我的重写绘制方法没有被调用

c++ - x86上的原子性

c++ - Qt 的 std::unordered_set 模拟/对应

c++ - MPI_Send 到在同一进程上运行的多个 POSIX 线程

c++ - 如何递归取消引用指针(C++03)?