Ошибка QObject: Cannot create children for a parent that is in a different thread.

202
06 мая 2018, 20:04

Вот такой вот несложный код бегаю по 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, потому что они в разных потоках, или не? Тем более похоже лишь некоторые обращения создают ошибку. Как мне выйти из этой ситуации?

READ ALSO
Как сравнивать два массива с обьектами в jest

Как сравнивать два массива с обьектами в jest

У меня есть 2 обьекта внутри у них есть свойство options это массив и внутри элементов массива есть обьекты со свойством variants который тоже является...

169
как установить компоненты галп из package.json?

как установить компоненты галп из package.json?

Такой вопрос у меня есть папка в ней - packagejson и нужные в нем компоненты

190
Замена буквы на заглавную

Замена буквы на заглавную

Выдает "arrreplace is not a function"

183
Vue.js событие на изменение опции в элементе &ldquo;select&rdquo;

Vue.js событие на изменение опции в элементе “select”

никак не могу понять, как сделать событие на тот случай, когда пользователь меняет опцию в select

174