Название: QNetworkAccessManager и QThread Отправлено: momo11 от Январь 13, 2014, 10:50 Сделал класс который в несколько потоков запрашивает страницу и результат выводит в qDebug.
хэдер: Код: #ifndef CHECK_H Сам файл Код: #include "check.h" Ошибки: Код: D:\QT\Tools\QtCreator\bin\myprog\check.cpp:3: ошибка: ISO C++ forbids declaration of 'run' with no type [-fpermissive] Название: Re: QNetworkAccessManager и QThread Отправлено: Serr500 от Январь 13, 2014, 11:16 void перед run и end в реализации кто будет указывать? Если нет ничего, предполагается int и сейчас так вообще не принято и большинство компиляторов по умолчанию это считает ошибкой.
Название: Re: QNetworkAccessManager и QThread Отправлено: momo11 от Январь 13, 2014, 12:41 Точно, исправил, но теперь программа крашится при запуске потока.
Запускаю так: Код: Check asd; и ошибки в выводе приложения: Код: QThread: Destroyed while thread is still running Название: Re: QNetworkAccessManager и QThread Отправлено: Serr500 от Январь 13, 2014, 12:59 Похоже, документацию по QThread Вы вообще не читали.
1) Как только завершился run, ваш потомок QThread остановит работу и ничего больше выполняться там не будет. 2) Переменная типа Check у Вас где-то в стеке функции и разрушается при выходе из этой функции. 3) Зачем Вам поток? QNAM сам по себе асинхронный. Название: Re: QNetworkAccessManager и QThread Отправлено: momo11 от Январь 13, 2014, 13:26 значит run завершается, а из run'a у меня идет сигнал connect(Mgr, SIGNAL(finished(QNetworkReply*)), this, SLOT(end(QNetworkReply*))); , как сделать чтобы run не завершался а ждал пока сигнал на сработает?
может быть создать бесконечный цикл который будет проверять записался ли в переменную исходный код страницы, если нет то ожидать и снова проверять Название: Re: QNetworkAccessManager и QThread Отправлено: momo11 от Январь 13, 2014, 13:32 или может у thread'ов есть какое нибудь свойство, которое не дает завершить поток пока все сигналы не сработали
Название: Re: QNetworkAccessManager и QThread Отправлено: Serr500 от Январь 13, 2014, 15:05 значит run завершается, а из run'a у меня идет сигнал connect(Mgr, SIGNAL(finished(QNetworkReply*)), this, SLOT(end(QNetworkReply*))); Сигнал идёт не из run'а. Сигнал идёт от QNAM, а в run он просто соединяется со слотом. Сигнал почти наверняка пойдёт уже после выхода из run.как сделать чтобы run не завершался а ждал пока сигнал на сработает? Например, в конце run вызвать exec. Тогда event loop потока будет крутиться, пока ему не вызовут quit (или terminate).может быть создать бесконечный цикл который будет проверять записался ли в переменную исходный код страницы, если нет то ожидать и снова проверять Это решение уровня DOS 5.0. ;Dили может у thread'ов есть какое нибудь свойство, которое не дает завершить поток пока все сигналы не сработали Нет.Название: Re: QNetworkAccessManager и QThread Отправлено: momo11 от Январь 13, 2014, 16:07 уже прогресс небольшой, вот методы класса который выполняется в потоке
Код: void Check::run() Код: QObject: Cannot create children for a parent that is in a different thread. вызываю так Код: asd.start(); Название: Re: QNetworkAccessManager и QThread Отправлено: Serr500 от Январь 13, 2014, 16:37 Код: QNetworkAccessManager *Mgr = new QNetworkAccessManager(); Название: Re: QNetworkAccessManager и QThread Отправлено: momo11 от Январь 13, 2014, 16:59 может я чего то не догоняю, но помоему ничего не изменилось, те же ошибки
Название: Re: QNetworkAccessManager и QThread Отправлено: Serr500 от Январь 13, 2014, 20:09 Выложите весь проект, будем посмотреть, по кускам непонятно.
Название: Re: QNetworkAccessManager и QThread Отправлено: Old от Январь 13, 2014, 20:22 может я чего то не догоняю, но помоему ничего не изменилось, те же ошибки Самое простое не передавать parent в конструктор QNetworkAccessManager (убрать this), но нужно будет не забывать самому его удалять.Лучше сделать так: Код
|