Russian Qt Forum

Qt => Работа с сетью => Тема начата: Kek от Июнь 26, 2017, 10:01



Название: Корректное завершение 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();
networkReply->close();
networkReply->deleteLater();
Провоцируют ошибки при выполнении и вся консоль забита
Код:
QIODevice::write: device not open
Т.е. я некорректно завершаю networkReply , команды выше тупо крашат прогу, как же правильно закрывать networkReply?


Название: 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 тредов) делать не надо.
У меня было подозрение на потоки и я пробовал оставить только 1 поток, это лишь отложило момент краша, на минуты 2-3  10-20 :(


Название: Re: Корректное завершение QNetworkReply, без вылетов
Отправлено: Kek от Июнь 29, 2017, 17:32
Забыл предупредить, если кто-то найдет время чтоб скачать проект и чекнуть ошибку то:

В файле "mainwindow.h" уберите эти включения, иначе выдаст ошибку (в проекте, что вы скачаете их нет)
Код:
#include "dudosbackend.h"
#include "dudosbackend_post_login.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, чтоб он удалился и ничего не упало?