Название: Корректное завершение QNetworkReply, без вылетов Отправлено: Kek от Июнь 26, 2017, 10:01 Актуальное описание проблемы в этом сообщении -> http://www.prog.org.ru/index.php?topic=31408.msg232441#msg232441 (http://www.prog.org.ru/index.php?topic=31408.msg232441#msg232441)
Название: Re: Корректное завершение QNetworkReply, без вылетов Отправлено: qate от Июнь 26, 2017, 15:13 1. 300 потоков это плохо
2. запускай и падай под отладчиком Название: Re: Корректное завершение QNetworkReply, без вылетов Отправлено: qate от Июнь 27, 2017, 08:17 либо бага qt, либо неправильное использование, о чем говорит строка *Private*
для багрепорта будет нужен минимальный пример и версию qt Название: Re: Корректное завершение QNetworkReply, без вылетов Отправлено: Kek от Июнь 27, 2017, 14:36 либо бага qt, либо неправильное использование, о чем говорит строка *Private* для багрепорта будет нужен минимальный пример и версию qt Кину весь поток целиком, он крохотный, версию тоже кинул ниже: ********************************************************** ВЕРСИЯ (https://pp.userapi.com/c841031/v841031432/4ad0/OmLhQWZFpYk.jpg) Название: Re: Корректное завершение QNetworkReply, без вылетов Отправлено: Kek от Июнь 27, 2017, 15:09 После еще порции тестов выявил, что версия HTTP 2.0 не при делах вообще, запрос выше все корректно запрашивает, добавил readAll(), HTML код страницы полностью соответствует реальности. Заметил, что именно команды:
Код: networkReply->abort(); Код: QIODevice::write: device not open Название: Re: Корректное завершение QNetworkReply, без вылетов Отправлено: qate от Июнь 27, 2017, 16:06 1. версия на дворе 5.9
2. кто так учил потоки делать ? зачем там таймер и евентлуп ? читать тут https://wiki.qt.io/Threads_Events_QObjects Название: Re: Корректное завершение QNetworkReply, без вылетов Отправлено: Авварон от Июнь 27, 2017, 16:24 Зис не надо передавать кунаму в парент. Три дня назад тема была аналогичная.
Название: Re: Корректное завершение QNetworkReply, без вылетов Отправлено: Kek от Июнь 27, 2017, 16:33 1. версия на дворе 5.9 2. кто так учил потоки делать ? зачем там таймер и евентлуп ? читать тут https://wiki.qt.io/Threads_Events_QObjects В версии 5.9 нет QWebView (который мне иногда нужен) для моего MinGW. Скрин кода выше - это просто функция "StartDudosThread", которая начинает выполняться, когда поток запущен. Создаю я их так: (https://pp.userapi.com/c841031/v841031432/4af7/8-uzDSjO2bY.jpg) Название: Re: Корректное завершение QNetworkReply, без вылетов Отправлено: Kek от Июнь 27, 2017, 16:43 Зис не надо передавать кунаму в парент. Три дня назад тема была аналогичная. Заменил QNetworkAccessManager *networkAccessManager = new QNetworkAccessManager(this); на QNetworkAccessManager *networkAccessManager = new QNetworkAccessManager(); Все равно заваливает ошибкой "QIODevice::write: device not open" и в конце концов крашится... Название: Re: Корректное завершение QNetworkReply, без вылетов Отправлено: Kek от Июнь 27, 2017, 17:18 Пздц, походу уже смысл темы потерян. Напишу заново:
При выполнении вот этого кода, а конкретнее цикла "while (threadIsEnable)", вылетает вот такая ошибка (скрины код/ошибка ниже): P.S. Ошибка происходит ИМЕННО при выполнении цикла. ************************************************************************ КОД С ПРОБЛЕМНЫМ ЦИКЛОМ (https://pp.userapi.com/c841031/v841031432/4b54/9WMatdb6TQU.jpg) ************************************************************************ ОШИБКА (https://pp.userapi.com/c841031/v841031432/4b03/av35grJKVIM.jpg) ************************************************************************ ОШИБКА С ОТЛАДЧИКОМ (https://pp.userapi.com/c841031/v841031432/48f5/q7OYMh-9FZI.jpg) Название: Re: Корректное завершение QNetworkReply, без вылетов Отправлено: kuzulis от Июнь 27, 2017, 19:16 Бррр.. это какая-то дичь (с)
Название: Re: Корректное завершение QNetworkReply, без вылетов Отправлено: Kek от Июнь 27, 2017, 20:08 Бррр.. это какая-то дичь (с) Тут все, как должно быть, работа программы меня устраивает... Не устраивает только одно, после минуты работы вылезает ошибка выше, я склоняюсь к тому, что к ней приводят деструктивные функции типа abort()... Но я не могу от них отказаться, если я их не использую, т.е. QNetworkReply создаются и создаются, то через некоторое время кончается память и процесс занимает 1+ ГБ, поэтому я позволяю им висеть 5 секунд, затем удаляю, им нельзя висеть дольше, после 5 секунд они должны быть закрыты, что бы они там не делали в этот момент (код с таймером на 5000 MS выше) P.S. Ждать ответ от сервера мне не надо, читать ответ мне тоже не надо, программа только генерирует запросы, так и задумано... P.S.S. Походу релоад темы нужен... Название: Re: Корректное завершение QNetworkReply, без вылетов Отправлено: qate от Июнь 28, 2017, 08:21 кто тебя учил код картинкой ставить ?
оформи нормально проект, запакуй в zip и прикрепи Название: Re: Корректное завершение QNetworkReply, без вылетов Отправлено: Kek от Июнь 29, 2017, 13:32 кто тебя учил код картинкой ставить ? оформи нормально проект, запакуй в zip и прикрепи Вот минимальный проект для воспроизведения проблемы, вырезал все второстепенное в том числе прокси, оставил только потоки и запросы. Через N времени (от 30 сек до 1-2 минут) начинаются ошибки QIODevice::write/read: device not open, затем приходит краш... https://drive.google.com/file/d/0B7-Ahrbw3_gORWo1MnVvaTZ0UU0/view (https://drive.google.com/file/d/0B7-Ahrbw3_gORWo1MnVvaTZ0UU0/view) Название: Re: Корректное завершение QNetworkReply, без вылетов Отправлено: Авварон от Июнь 29, 2017, 16:22 Цитировать (process:28413): GLib-ERROR **: Creating pipes for GWakeup: Слишком много открытых файлов Ксттаи да, this у кунама нипричем, я думал, что у него парентом тред, а на самом деле - объект в треде. Так что там ошибки не было. Краш происходит при попытке создать тред (всего у меня 610 тредов на момент краша) внутри треда Qt Http Thread. Похоже, QNAM сам создает (http://blog.qt.io/blog/2011/04/29/threaded-http-inside-qnetworkaccessmanager/) треды. Вкратце - так (создавать 300 тредов) делать не надо. Название: Re: Корректное завершение QNetworkReply, без вылетов Отправлено: Kek от Июнь 29, 2017, 17:15 Цитировать (process:28413): GLib-ERROR **: Creating pipes for GWakeup: Слишком много открытых файлов Ксттаи да, this у кунама нипричем, я думал, что у него парентом тред, а на самом деле - объект в треде. Так что там ошибки не было. Краш происходит при попытке создать тред (всего у меня 610 тредов на момент краша) внутри треда Qt Http Thread. Похоже, QNAM сам создает (http://blog.qt.io/blog/2011/04/29/threaded-http-inside-qnetworkaccessmanager/) треды. Вкратце - так (создавать 300 тредов) делать не надо. Название: Re: Корректное завершение QNetworkReply, без вылетов Отправлено: Kek от Июнь 29, 2017, 17:32 Забыл предупредить, если кто-то найдет время чтоб скачать проект и чекнуть ошибку то:
В файле "mainwindow.h" уберите эти включения, иначе выдаст ошибку (в проекте, что вы скачаете их нет) Код: #include "dudosbackend.h" Когда скомпилируете проект в релиз, в папку релиз-проекта, в папку /release рядом с "exe" файлом положите эти dll, без них не будут работать HTTPS... https://drive.google.com/file/d/0B7-Ahrbw3_gOcHZtM1VBM2ZXeDQ/view?usp=sharing (https://drive.google.com/file/d/0B7-Ahrbw3_gOcHZtM1VBM2ZXeDQ/view?usp=sharing) Название: Re: Корректное завершение QNetworkReply, без вылетов Отправлено: Kek от Июнь 29, 2017, 17:38 Чтоб в 1 потоке сымитировать ошибку быстрее, а не ждать ее 20-30 минут, замените в файле "dudosbackend_connect.cpp"
"timerReply.start(20);" на "timerReply.start(10);" и она случится через минуту-две... Название: Re: Корректное завершение QNetworkReply, без вылетов Отправлено: Авварон от Июнь 29, 2017, 17:54 Ну падает в QCoreApplication::notify(), что означает, что кто-то пытается доставить эвент удаленному объекту.
Название: Re: Корректное завершение QNetworkReply, без вылетов Отправлено: Kek от Июнь 29, 2017, 19:10 Ну падает в QCoreApplication::notify(), что означает, что кто-то пытается доставить эвент удаленному объекту. Вот, дело значит в abort/close/delete... Как и писал ранее, так как же корректно удалять этот чертов NetworkReply, чтоб он удалился и ничего не упало? |