Qt:这段代码中的QBuffer线程安全吗?
Qt: Is the QBuffer thread safe in this code?
代码如下:
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()在主线程中,运行()在worker中线。
可能的问题是通过reading/writing到bytes和buffer在不同的线程中,会不会引起线程相关的问题?
如果在 run
处于活动状态时调用了 Finished
,那么是的,您遇到了问题。在管道中(串行)运行 的两个线程之间共享数据不一定是问题。同时访问非线程安全的、两个线程之间的共享数据总是一个问题。我已经很多年没有使用 Qt 了,所以 QBuffer
或 QImage::loadFromData
也可能提供它们自己的线程安全保证。
代码如下:
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()在主线程中,运行()在worker中线。 可能的问题是通过reading/writing到bytes和buffer在不同的线程中,会不会引起线程相关的问题?
如果在 run
处于活动状态时调用了 Finished
,那么是的,您遇到了问题。在管道中(串行)运行 的两个线程之间共享数据不一定是问题。同时访问非线程安全的、两个线程之间的共享数据总是一个问题。我已经很多年没有使用 Qt 了,所以 QBuffer
或 QImage::loadFromData
也可能提供它们自己的线程安全保证。