Вот такой вот несложный код бегаю по QMap вытаскиваю сайт и его загружаю. Несколько раз получаю это
QObject: Cannot create children for a parent that is in a different thread. (Parent is QNetworkAccessManager(0xbfeb70), parent's thread is QThread(0xbaa7e0), current thread is QThread(0x71eab60)
mainwindow.cpp:
void MainWindow::slCl4()
{
readFileToArr();
QMapIterator<QString, QString> m(mapPillows);
while (m.hasNext()) {
m.next();
QString key = m.key();
QString val = m.value();
QFuture<void> future = QtConcurrent::run(inOtherFlow, key, val);
future.waitForFinished();
}
}
void MainWindow::inOtherFlow(QString strSite, QString strPillow)
{
Downloader* downloader = Downloader::getInstance();
downloader->getData(strSite, 2);
}
downloader.cpp:
Downloader* Downloader::downloader = 0;
Downloader::Downloader(QObject *parent) : QObject(parent)
{
// Инициализируем менеджер ...
manager = new QNetworkAccessManager();
// ... и подключаем сигнал о завершении получения данных к обработчику полученного ответа
connect(manager, &QNetworkAccessManager::finished, this, &Downloader::onResult);
}
Downloader *Downloader::getInstance()
{
if(downloader==0) {
downloader = new Downloader();
}
return downloader;
}
void Downloader::getData(QString str, int what)
{
whatdownloaded = what;
QUrl url(str); // URL, к которому будем получать данные
QNetworkRequest request; // Отправляемый запрос
request.setUrl(url); // Устанавлвиваем URL в запрос
manager->get(request); // Выполняем запрос
return;
}
void Downloader::onResult(QNetworkReply *reply)
{
// Если в процесе получения данных произошла ошибка
if(reply->error()){
// Сообщаем об этом и показываем информацию об ошибках
qDebug() << "ERROR";
qDebug() << reply->errorString();
emit sidownloaderr();
} else {
QByteArray str = reply->readAll();
//QUrl url = reply->url();
QString site = reply->url().toString();
emit onReady(str, whatdownloaded, site); // Посылаем сигнал о завершении получения файла
}
//whatdownloaded=0;
}
Я так подозреваю это из-за Downloader* downloader = Downloader::getInstance();
потому что в переводе нельзя создать потомка для родителя что находиться в другом потоке. Т.е. как я понял поток созданный QtConcurent не может использовать QNetworkAccessManager, потому что они в разных потоках, или не? Тем более похоже лишь некоторые обращения создают ошибку. Как мне выйти из этой ситуации?
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
У меня есть 2 обьекта внутри у них есть свойство options это массив и внутри элементов массива есть обьекты со свойством variants который тоже является...
Такой вопрос у меня есть папка в ней - packagejson и нужные в нем компоненты
никак не могу понять, как сделать событие на тот случай, когда пользователь меняет опцию в select