Multithreading 线程中的网络请求正在使我的应用程序崩溃
目前我有一个代码正在崩溃(SEGFAULT) 我试图将我驱动器中的大量图像与其服务器中的计数器部件进行比较 为了加快进程,我从服务器获取图像,并在不同的线程上比较图像 从我已经尝试和调试的内容来看,问题在于从服务器获取映像(这就是其他调用被注释掉的原因) 另外,如果我在没有QtConcurrent::run的情况下运行,它不会崩溃,但是如果我将信号量concurrentcomparations放在只有一个资源的情况下,它会崩溃 最后,我还得到了以下错误Multithreading 线程中的网络请求正在使我的应用程序崩溃,multithreading,qt,c++11,qthread,qtnetwork,Multithreading,Qt,C++11,Qthread,Qtnetwork,目前我有一个代码正在崩溃(SEGFAULT) 我试图将我驱动器中的大量图像与其服务器中的计数器部件进行比较 为了加快进程,我从服务器获取图像,并在不同的线程上比较图像 从我已经尝试和调试的内容来看,问题在于从服务器获取映像(这就是其他调用被注释掉的原因) 另外,如果我在没有QtConcurrent::run的情况下运行,它不会崩溃,但是如果我将信号量concurrentcomparations放在只有一个资源的情况下,它会崩溃 最后,我还得到了以下错误 QObject::connect: Can
QObject::connect: Cannot connect (null)::configurationAdded(QNetworkConfiguration) to QNetworkConfigurationManager::configurationAdded(QNetworkConfiguration)
QObject::connect: Cannot connect (null)::configurationRemoved(QNetworkConfiguration) to QNetworkConfigurationManager::configurationRemoved(QNetworkConfiguration)
QObject::connect: Cannot connect (null)::configurationChanged(QNetworkConfiguration) to QNetworkConfigurationManager::configurationChanged(QNetworkConfiguration)
QObject::connect: Cannot connect (null)::onlineStateChanged(bool) to QNetworkConfigurationManager::onlineStateChanged(bool)
QObject::connect: Cannot connect (null)::configurationUpdateComplete() to QNetworkConfigurationManager::updateCompleted()
任何帮助都将不胜感激
相关代码:
QSemaphore FileComparisonInfo::concurrentComparisons(1);
QImage*ImageComparer::getImageFromURL(QString url)
{
QNetworkAccessManager*tempNAM=新的QNetworkAccessManager();
QNetworkReply*imageConnection=tempNAM->get(QNetworkRequest(qrl(url));
QEventLoop循环;
连接(图像连接、信号(finished())、循环和插槽(quit());
loop.exec();
QImage*下载图像;
如果(imageConnection->error()!=QNetworkReply::NoError)
{
qDebug()错误字符串();
downloadeImage=new QImage();
}
其他的
{
QByteArray data=imageConnection->readAll();
DownloadeImage=新的QImage(QImage::fromData(data));
}
tempNAM->deleteLater();
imageConnection->deleteLater();
返回下载的图像;
}
不幸的是,这与代码无关
其中一个图像已损坏,并且在比较过程中出现错误 它不是所有相关的代码。connect()在何处调用QNetworkConfigurationManager对象插槽?指向本应发出信号的对象的指针设置为null。我的代码中没有使用QNetworkConfigurationManager。它在QNetworkAccessManager内部使用。
QtConcurrent::run( [this, localPath, imageURL]()
{
ImageComparer cmp;
FileComparisonInfo::concurrentComparisons.acquire();
//cmp.setImageLeftPath(localPath);
cmp.setImageRightPath(imageURL);
//cmp.createDifferenceImage();
FileComparisonInfo::concurrentComparisons.release();
});
void ImageComparer::setImageRightPath(QString path)
{
this->rightImagePath = path;
this->imageRight = getImage(path);
}
QImage* ImageComparer::getImage(QString path)
{
QUrl url(path);
QFile file(path);
if(file.exists())
{
return new QImage(path);
}
else if(url.isValid())
{
return getImageFromURL(path);
}
}
QImage* ImageComparer::getImageFromURL(QString url)
{
QNetworkAccessManager * tempNAM = new QNetworkAccessManager();
QNetworkReply *imageConnection = tempNAM->get( QNetworkRequest( QUrl( url ) ));
QEventLoop loop;
connect(imageConnection, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
QImage * downloadedImage;
if(imageConnection->error() != QNetworkReply::NoError)
{
qDebug() << imageConnection->errorString();
downloadedImage = new QImage();
}
else
{
QByteArray data = imageConnection->readAll();
downloadedImage = new QImage(QImage::fromData(data));
}
tempNAM->deleteLater();
imageConnection->deleteLater();
return downloadedImage;
}