Russian Qt Forum

Qt => Общие вопросы => Тема начата: serg_hd от Март 10, 2010, 22:27



Название: QWaitCondition: Destroyed while threads are still waiting
Отправлено: serg_hd от Март 10, 2010, 22:27
Сабж, что это за ошибка и как её побороть? Приложение многопоточное, потоки создаются непрерывно, так же и завершаются. Но в процессе своей работы каждый из потоков "говорит" проге грузить контент в qwebview своего класса. Т.е. сам run() завершается, а работа runnable-класса (c помощью других его методов) завершается после некоторых операций с qwebview.
Вобщем ошибка вылетает в разное время, было и после 11, и 25 минуты работы проги...
Есть информация (http://bugreports.qt.nokia.com/browse/QTBUG-7691), но там указано "The following problem with QNetworkAccessManager has appeared after Qt 4.6.1 update.". У меня же 4.5. Блин, ладно бы хоть прога не вылетала из-за неё((


Название: Re: QWaitCondition: Destroyed while threads are still waiting
Отправлено: BRE от Март 10, 2010, 22:44
Ты бы код показал.
Как создаешь, как завершаешь, кто-что ждет?


Название: Re: QWaitCondition: Destroyed while threads are still waiting
Отправлено: serg_hd от Март 10, 2010, 22:53
Ты бы код показал.
Как создаешь, как завершаешь, кто-что ждет?
Если выложу весь код runnable-класса (1.5к строк) на java это многое изменит?
Создаю что именно, поток? Создаётся он и запускается как обычно
Код
Java
ThreadCore core = new thread_engine.ThreadCore(this, hMap);
QThread thread = new QThread(core);
thread.setDaemon(true);
thread.start();
 
Никак не завершаю (java сама чистит память) и ничто ничего не ждёт. А как-то специально завершать потоки разве надо (именно со стороны qt)?


Название: Re: QWaitCondition: Destroyed while threads are still waiting
Отправлено: BRE от Март 10, 2010, 23:03
Если выложу весь код runnable-класса (1.5к строк) на java это многое изменит?
А ты думаешь по твоему вопросу можно понять что у тебя делается в программе?
Не нужен весь код класс, хотя бы куски кода с пояснениями, как и кто потоки запускает, что он делает, как он возвращает результат своей работы и как завершается.

А как-то специально завершать потоки разве надо (именно со стороны qt)?
Это от самого потока зависит.


Название: Re: QWaitCondition: Destroyed while threads are still waiting
Отправлено: serg_hd от Март 10, 2010, 23:11
А ты думаешь по твоему вопросу можно понять что у тебя делается в программе?
Так я же написал в первом посте что делается.


Название: Re: QWaitCondition: Destroyed while threads are still waiting
Отправлено: serg_hd от Март 10, 2010, 23:13
А как-то специально завершать потоки разве надо (именно со стороны qt)?
Это от самого потока зависит.
к моменту завершения работы runnable-класса с qwebview сам поток этого класса мёртв, т.к. в его задачу входит только расчёт определённых параметров, которые будут браться как аргументы сигнала на создание qwebview, вряд ли надо что-то завершать...


Название: Re: QWaitCondition: Destroyed while threads are still waiting
Отправлено: BRE от Март 10, 2010, 23:17
Т.е. сам run() завершается, а работа runnable-класса (c помощью других его методов) завершается после некоторых операций с qwebview.
Ну здесь же все понятно и без слов:
"... с помощью других методов .... после некоторых операций..."   ::)
Поэтому и попросил кода.  :)


Название: Re: QWaitCondition: Destroyed while threads are still waiting
Отправлено: niXman от Март 11, 2010, 00:12
думаю что искать ошибку нужно с другой стороны.
access violation - это не ошибка в коде юзера(тем более, в коде на жава).
другое дело, что эта ошибка "порождена" действиями юзера.

но и тут не все так гладко:
1. жава сама управляет памятью.
2. программа падает через произвольное время.

такие ошибки(все кто пишет на С/С++ знает) очень сложно выявить.
обычно помогают всеобразные трасировщики. но опять таки, жава! лично я хз какие можно применить инструменты, для выявления таких ошибок(возникающих на системном уровне), при написании проги на жава.

наверное нужно гуглить...


Название: Re: QWaitCondition: Destroyed while threads are still waiting
Отправлено: serg_hd от Март 11, 2010, 13:24
Эта ошибка попадается и у прогеров на питоне (http://old.nabble.com/Problem-with-QWebView-td22898481.html). Так что дело только в самом qt.


Название: Re: QWaitCondition: Destroyed while threads are still waiting
Отправлено: serg_hd от Март 11, 2010, 16:52
Картина Репина "приплыли". Прога 3 месяца писалась. QT, конечно, может обрадовать в нужный момент, спору нет. Я так думаю предлагать деньги за решение проблемы тоже бессмысленно (на всякий случай - торги можем начать со 100уе ;))?


Название: Re: QWaitCondition: Destroyed while threads are still waiting
Отправлено: Пантер от Март 11, 2010, 17:38
Пересмотри архитектуру, дело не в Qt.


Название: Re: QWaitCondition: Destroyed while threads are still waiting
Отправлено: serg_hd от Март 11, 2010, 17:59
Пересмотри архитектуру, дело не в Qt.
Текст и ссылки выше говорят о прямо противоположном.


Название: Re: QWaitCondition: Destroyed while threads are still waiting
Отправлено: Пантер от Март 11, 2010, 18:07
У меня эта ошибка не раз попадалась при работе с потоками, все сводилось к устранению моих ошибок.


Название: Re: QWaitCondition: Destroyed while threads are still waiting
Отправлено: serg_hd от Март 11, 2010, 18:15
У меня эта ошибка не раз попадалась при работе с потоками, все сводилось к устранению моих ошибок.
Почему же тогда тут (http://bugreports.qt.nokia.com/browse/QTBUG-7691?actionOrder=desc) другая ситуация?
все сводилось к устранению моих ошибок
Например каких? Вы работали с qwebview при этом? Если нет - то мы говорим о разных проблемах.
Вам известно, например, что QNetworkAccessManager использует свои внутренние потоки, которые почему-то не завершаются перед удалением самого QNetworkAccessManager'a (это насколько я понял)? Что-то пока не представляю в каком тут месте ошибка со стороны моего кода.


Название: Re: QWaitCondition: Destroyed while threads are still waiting
Отправлено: serg_hd от Март 11, 2010, 19:11
И ещё заметил, что по мере работы приложения занимаемый им объём оперативной памяти постоянно растёт. На JVM выделено жёстко 256 метров максимум, значит увеличивается за счёт qt. Может что-то надо как-то подчищать? Чистить qwebview, qnetworkaccessmanager пробовал, ситуация только хуже (такая ошибка в этом случае вылезет гораздо раньше). Чистил именно тогда, когда никаких обращений к этим объектам, естественно, больше быть не могло. 


Название: Re: QWaitCondition: Destroyed while threads are still waiting
Отправлено: serg_hd от Март 11, 2010, 19:32
Да и собственно ошибка:
Код
Java
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x05320257, pid=16580, tid=6260
#
# Java VM: Java HotSpot(TM) Client VM (10.0-b19 mixed mode, sharing windows-x86)
# Problematic frame:
# C  [QtWebKit4.dll+0x70257]
#
# An error report file with more information is saved as:
# C:\...\hs_err_pid16580.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
QWaitCondition: Destroyed while threads are still waiting
 


Название: Re: QWaitCondition: Destroyed while threads are still waiting
Отправлено: niXman от Март 11, 2010, 22:20
Цитировать
EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x05320257, pid=16580, tid=6260
вот с этого и нужно было начинать! причина в этом!

а -
Цитировать
QWaitCondition: Destroyed while threads are still waiting
следствие!


Название: Re: QWaitCondition: Destroyed while threads are still waiting
Отправлено: muzhig от Май 27, 2010, 12:10
Мое мнение, что ошибка связана с двумя вещами:
сетевым соединением и завершением потока.

У меня есть потомок QThread у которого есть член QTcpSocket.
В соответствии с сигналами, сокет открывается и закрывается.

В деструкторе потока я делаю принудительный дисконнект, потом жду пока дисконнектится и сделается quit(), и объект потока уничтожается.

* Если я не делал коннекта ни разу, ошибки не возникает
* Если я сделал коннект и уничтожаю поток- получаю ошибку при попытке disconectFromHost() в деструкторе, природу которой я пока изучаю
* Если я сделал коннект и дисконнект, после чего уничтожаю поток- возникает описанная автором ошибка с QWaitCondition
* Если я сделал коннект и дисконнект, после чего подожду немного, а только потом уничтожаю поток- ошибки не возникает.

напрашивается вывод: ошибка с QWaitCondition связана с тем, что сокет нельзя уничтожать сразу после дисконнекта.