Russian Qt Forum
Ноябрь 24, 2024, 13:46
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
зависает QPluginLoader::unload()
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: зависает QPluginLoader::unload() (Прочитано 8073 раз)
QCasper
Гость
зависает QPluginLoader::unload()
«
:
Март 30, 2007, 09:41 »
У меня есть плагин, который выполняет определенные действия (они связаны с передачей данных по http). Так вот если просто загрузить плагин, то он нормально выгружается. А если загрузить, дать ему пораобтать, остановить его работу, то программа зависает на QPluginLoader::unload(), управление из этой ф-ции просто не возвращется. Такое ощущение, что там где-то на бесконечный цикл натыкается программа. Из-за чего это теоретически может происходить?
Записан
Admin
Administrator
Джедай : наставник для всех
Offline
Сообщений: 1988
зависает QPluginLoader::unload()
«
Ответ #1 :
Март 30, 2007, 11:04 »
1) плагин треды создает?
2) сокет точно закрывается?
3) редко - стек нарушается
Записан
QCasper
Гость
зависает QPluginLoader::unload()
«
Ответ #2 :
Март 30, 2007, 12:22 »
Цитата: "Admin"
1) плагин треды создает?
2) сокет точно закрывается?
3) редко - стек нарушается
1) Нет.
2) Как например? в деструкторе делаю http->abort()
3) это как понять и как бороться? у меня довольно часто возникает.
Записан
Tonal
Гость
зависает QPluginLoader::unload()
«
Ответ #3 :
Март 30, 2007, 16:30 »
А если стопнуть и стек посмотреть?
Записан
QCasper
Гость
зависает QPluginLoader::unload()
«
Ответ #4 :
Март 31, 2007, 17:18 »
Цитата: "Tonal"
А если стопнуть и стек посмотреть?
ntdll.dll!7c90eb94()
ntdll.dll!7c90e9c0()
kernel32.dll!7c8025db()
> QtCored4.dll!QBasicAtomic::testAndSetAcquire(int expected=2088773128, int newval=0) Line 96 + 0x18 C++
kernel32.dll!7c8399f3()
kernel32.dll!7c802542()
QtCored4.dll!QThread::wait(unsigned long time=4294967295) Line 406 + 0x11 C++
QtNetworkd4.dll!QHostInfoAgent::cleanup() Line 129 C++
QtNetworkd4.dll!QHostInfoAgent::~QHostInfoAgent() Line 89 + 0x34 C++
QtNetworkd4.dll!QHostInfoAgent::`scalar deleting destructor'() + 0xf C++
QtNetworkd4.dll!QGlobalStatic<QHostInfoAgent>::~QGlobalStatic<QHostInfoAgent>() Line 1332 + 0x21 C++
QtNetworkd4.dll!$E2() + 0xd C++
QtNetworkd4.dll!_CRT_INIT(void * hDllHandle=0x64000000, unsigned long dwReason=0, void * lpreserved=0x00000000) Line 234 C
QtNetworkd4.dll!_DllMainCRTStartup(void * hDllHandle=0x64000000, unsigned long dwReason=0, void * lpreserved=0x00000000) Line 288 + 0x11 C
ntdll.dll!7c9011a7()
ntdll.dll!7c91e6f4()
msvcr71d.dll!_free_base(void * pBlock=0x00000000) Line 103 C
msvcr71d.dll!_free_dbg_lk(void * pUserData=, int nBlockUse=) Line 1207 + 0x9 C
добавлено спустя 5 минут:
Кстати когда паузил дебаг мне вывалилась табличка:
"The process appears to be deadlocked (or is not running any user-mode code). All threads have been stopped."
Записан
Tonal
Гость
зависает QPluginLoader::unload()
«
Ответ #5 :
Март 31, 2007, 19:09 »
QHostInfoAgent - наследник QThread.
Так что неявно твой плагин создаёт таки поток.
И висит именно в его деструкторе...
Попробуй http->abort() сделать явно, до выгрузки плагина...
Записан
QCasper
Гость
зависает QPluginLoader::unload()
«
Ответ #6 :
Март 31, 2007, 20:27 »
Цитата: "Tonal"
QHostInfoAgent - наследник QThread.
Так что неявно твой плагин создаёт таки поток.
И висит именно в его деструкторе...
Попробуй http->abort() сделать явно, до выгрузки плагина...
Ну то что неявно он создает поток то понятно, я же говорю QHttp использую. Я имел ввиду я сам поток не создаю.
Записан
Tonal
Гость
зависает QPluginLoader::unload()
«
Ответ #7 :
Апрель 01, 2007, 15:53 »
Разницы нет, сам ты поток создаёшь, или ещё кто-то.
Главное, что он создаётся и то, что в в стартовой функции Dll нельзя вызывать функции ожидания (см у Рихтера "Как система упорядочивает вызовы DIIMain").
Так что выход один: позаботиться о том, чтобы на момент выгрузки никакие потоки не завершались.
Т.е. надо стопать коннект до выгрузки.
Записан
QCasper
Гость
зависает QPluginLoader::unload()
«
Ответ #8 :
Апрель 01, 2007, 16:54 »
Цитата: "Tonal"
Разницы нет, сам ты поток создаёшь, или ещё кто-то.
Главное, что он создаётся и то, что в в стартовой функции Dll нельзя вызывать функции ожидания (см у Рихтера "Как система упорядочивает вызовы DIIMain").
Так что выход один: позаботиться о том, чтобы на момент выгрузки никакие потоки не завершались.
Т.е. надо стопать коннект до выгрузки.
чем стопить лучше qhttp? abort? close?
добавлено спустя 13 минут:
Не помогает abort()
Вызываю вручную, нажатием на кнопку. А потом только удаляю объект.
Записан
QCasper
Гость
зависает QPluginLoader::unload()
«
Ответ #9 :
Апрель 04, 2007, 10:49 »
Я тут заметил одну вещь. Если сразу не пытаться выгружать плагин, а дождаться пока не завершаться три каких-то потока, это видно в output во время debag'a в VS, то плагин выгружается нормально. В связи с этим у меня вопрос, можно ли как-то получить эти потоки и насильно их замочить? Причем могу уверенно сказать, что http коннекта к хосту точно нет. То есть сначала я вижу сигнал stateChanged(state) где state == 0 (Unconnected), а только через время, вижу в аутпуте как эти три потока завершаются.
Записан
Tonal
Гость
зависает QPluginLoader::unload()
«
Ответ #10 :
Апрель 05, 2007, 12:09 »
Попробуй до загрузки плагина создать подключение - а удалить после.
Может поможет.
А вообще-то, надо делать минимальный пример и писать Тролям.
Записан
QCasper
Гость
зависает QPluginLoader::unload()
«
Ответ #11 :
Апрель 17, 2007, 15:52 »
Цитата: "Tonal"
Попробуй до загрузки плагина создать подключение - а удалить после.
Может поможет.
А вообще-то, надо делать минимальный пример и писать Тролям.
Здрасьте, а как это, у меня плагин отвечает за подключение, приложение и не знает даже чем там он занимается
Оно только загружает его, говорит: "работай давай", потом говорит: "все, хорош", и выгружает его
Записан
Tonal
Гость
зависает QPluginLoader::unload()
«
Ответ #12 :
Апрель 19, 2007, 13:25 »
Можно так извратиться:
1) приложение загружает плагин
2) плагин говорит приложению - инициализируй мине сеточку
3) приложение инициализирует
4) плагин работает
5) приложение выгружает плагин
Вот здесь приложение может стопнуть сеть...
Записан
QCasper
Гость
зависает QPluginLoader::unload()
«
Ответ #13 :
Апрель 23, 2007, 14:19 »
Цитата: "Tonal"
Можно так извратиться:
1) приложение загружает плагин
2) плагин говорит приложению - инициализируй мине сеточку
3) приложение инициализирует
4) плагин работает
5) приложение выгружает плагин
Вот здесь приложение может стопнуть сеть...
Да не, беспонтово. Говорю же приложение не должно ничего знать о работе плагина, потому что плагинов много и все они разные, и переписывать каждый раз приложение под нужды каждого нового плагина - не очень прикольно. Само понятие плагины теряет всякий смысл, проще тогда уж приложение расширять.
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...