Russian Qt Forum
Апрель 26, 2024, 06:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Корректное завершение QNetworkReply, без вылетов  (Прочитано 13525 раз)
Kek
Гость
« : Июнь 26, 2017, 10:01 »

Актуальное описание проблемы в этом сообщении -> http://www.prog.org.ru/index.php?topic=31408.msg232441#msg232441
« Последнее редактирование: Июнь 27, 2017, 20:18 от Kek » Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #1 : Июнь 26, 2017, 15:13 »

1. 300 потоков это плохо
2. запускай и падай под отладчиком
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #2 : Июнь 27, 2017, 08:17 »

либо бага qt, либо неправильное использование, о чем говорит строка *Private*
для багрепорта будет нужен минимальный пример и версию qt

Записан
Kek
Гость
« Ответ #3 : Июнь 27, 2017, 14:36 »

либо бага qt, либо неправильное использование, о чем говорит строка *Private*
для багрепорта будет нужен минимальный пример и версию qt



Кину весь поток целиком, он крохотный, версию тоже кинул ниже:

**********************************************************
ВЕРСИЯ



« Последнее редактирование: Июнь 27, 2017, 20:14 от Kek » Записан
Kek
Гость
« Ответ #4 : Июнь 27, 2017, 15:09 »

После еще порции тестов выявил, что версия HTTP 2.0 не при делах вообще, запрос выше все корректно запрашивает, добавил readAll(), HTML код страницы полностью соответствует реальности. Заметил, что именно команды:
Код:
networkReply->abort();
networkReply->close();
networkReply->deleteLater();
Провоцируют ошибки при выполнении и вся консоль забита
Код:
QIODevice::write: device not open
Т.е. я некорректно завершаю networkReply , команды выше тупо крашат прогу, как же правильно закрывать networkReply?
« Последнее редактирование: Июнь 27, 2017, 20:15 от Kek » Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #5 : Июнь 27, 2017, 16:06 »

1. версия на дворе 5.9
2. кто так учил потоки делать ? зачем там таймер и евентлуп ? читать тут https://wiki.qt.io/Threads_Events_QObjects
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #6 : Июнь 27, 2017, 16:24 »

Зис не надо передавать кунаму в парент. Три дня назад тема была аналогичная.
Записан
Kek
Гость
« Ответ #7 : Июнь 27, 2017, 16:33 »

1. версия на дворе 5.9
2. кто так учил потоки делать ? зачем там таймер и евентлуп ? читать тут https://wiki.qt.io/Threads_Events_QObjects

В версии 5.9 нет QWebView (который мне иногда нужен) для моего MinGW. Скрин кода выше - это просто функция "StartDudosThread", которая начинает выполняться, когда поток запущен. Создаю я их так:


Записан
Kek
Гость
« Ответ #8 : Июнь 27, 2017, 16:43 »

Зис не надо передавать кунаму в парент. Три дня назад тема была аналогичная.
Заменил
QNetworkAccessManager *networkAccessManager = new QNetworkAccessManager(this);
на
QNetworkAccessManager *networkAccessManager = new QNetworkAccessManager();

Все равно заваливает ошибкой "QIODevice::write: device not open" и в конце концов крашится...
Записан
Kek
Гость
« Ответ #9 : Июнь 27, 2017, 17:18 »

Пздц, походу уже смысл темы потерян. Напишу заново:
При выполнении вот этого кода, а конкретнее цикла "while (threadIsEnable)", вылетает вот такая ошибка (скрины код/ошибка ниже):

P.S. Ошибка происходит ИМЕННО при выполнении цикла.

************************************************************************
КОД С ПРОБЛЕМНЫМ ЦИКЛОМ



************************************************************************
ОШИБКА



************************************************************************
ОШИБКА С ОТЛАДЧИКОМ


« Последнее редактирование: Июнь 27, 2017, 20:21 от Kek » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #10 : Июнь 27, 2017, 19:16 »

Бррр.. это какая-то дичь (с)
Записан

ArchLinux x86_64 / Win10 64 bit
Kek
Гость
« Ответ #11 : Июнь 27, 2017, 20:08 »

Бррр.. это какая-то дичь (с)

Тут все, как должно быть, работа программы меня устраивает... Не устраивает только одно, после минуты работы вылезает ошибка выше, я склоняюсь к тому, что к ней приводят деструктивные функции типа abort()... Но я не могу от них отказаться, если я их не использую, т.е. QNetworkReply создаются и создаются, то через некоторое время кончается память и процесс занимает 1+ ГБ, поэтому я позволяю им висеть 5 секунд, затем удаляю, им нельзя висеть дольше, после 5 секунд они должны быть закрыты, что бы они там не делали в этот момент (код с таймером на 5000 MS выше)

P.S. Ждать ответ от сервера мне не надо, читать ответ мне тоже не надо, программа только генерирует запросы, так и задумано...
P.S.S. Походу релоад темы нужен...
« Последнее редактирование: Июнь 27, 2017, 20:37 от Kek » Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #12 : Июнь 28, 2017, 08:21 »

кто тебя учил код картинкой ставить ?
оформи нормально проект, запакуй в zip и прикрепи

Записан
Kek
Гость
« Ответ #13 : Июнь 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
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #14 : Июнь 29, 2017, 16:22 »

Цитировать
(process:28413): GLib-ERROR **: Creating pipes for GWakeup: Слишком много открытых файлов

Ксттаи да, this у кунама нипричем, я думал, что у него парентом тред, а на самом деле - объект в треде. Так что там ошибки не было.

Краш происходит при попытке создать тред (всего у меня 610 тредов на момент краша) внутри треда Qt Http Thread. Похоже, QNAM сам создает треды.
Вкратце - так (создавать 300 тредов) делать не надо.
« Последнее редактирование: Июнь 29, 2017, 16:30 от Авварон » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 23.