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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: зависает QPluginLoader::unload()  (Прочитано 8021 раз)
QCasper
Гость
« : Март 30, 2007, 09:41 »

У меня есть плагин, который выполняет определенные действия (они связаны с передачей данных по http). Так вот если просто загрузить плагин, то он нормально выгружается. А если загрузить, дать ему пораобтать, остановить его работу, то программа зависает на QPluginLoader::unload(), управление из этой ф-ции просто не возвращется. Такое ощущение, что там где-то на бесконечный цикл натыкается программа. Из-за чего это теоретически может происходить?
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #1 : Март 30, 2007, 11:04 »

1) плагин треды создает?
2) сокет точно закрывается?
3) редко - стек нарушается
Записан
QCasper
Гость
« Ответ #2 : Март 30, 2007, 12:22 »

Цитата: "Admin"
1) плагин треды создает?
2) сокет точно закрывается?
3) редко - стек нарушается


1) Нет.
2) Как например? в деструкторе делаю http->abort()
3) это как понять и как бороться? у меня довольно часто возникает.
Записан
Tonal
Гость
« Ответ #3 : Март 30, 2007, 16:30 »

А если стопнуть и стек посмотреть?
Записан
QCasper
Гость
« Ответ #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
Гость
« Ответ #5 : Март 31, 2007, 19:09 »

QHostInfoAgent - наследник QThread.
Так что неявно твой плагин создаёт таки поток.
И висит именно в его деструкторе...

Попробуй http->abort() сделать явно, до выгрузки плагина...
Записан
QCasper
Гость
« Ответ #6 : Март 31, 2007, 20:27 »

Цитата: "Tonal"
QHostInfoAgent - наследник QThread.
Так что неявно твой плагин создаёт таки поток.
И висит именно в его деструкторе...

Попробуй http->abort() сделать явно, до выгрузки плагина...


Ну то что неявно он создает поток то понятно, я же говорю QHttp использую. Я имел ввиду я сам поток не создаю.
Записан
Tonal
Гость
« Ответ #7 : Апрель 01, 2007, 15:53 »

Разницы нет, сам ты поток создаёшь, или ещё кто-то.
Главное, что он создаётся и то, что в в стартовой функции Dll нельзя вызывать функции ожидания (см у Рихтера "Как система упорядочивает вызовы DIIMain").
Так что выход один: позаботиться о том, чтобы на момент выгрузки никакие потоки не завершались.
Т.е. надо стопать коннект до выгрузки.
Записан
QCasper
Гость
« Ответ #8 : Апрель 01, 2007, 16:54 »

Цитата: "Tonal"
Разницы нет, сам ты поток создаёшь, или ещё кто-то.
Главное, что он создаётся и то, что в в стартовой функции Dll нельзя вызывать функции ожидания (см у Рихтера "Как система упорядочивает вызовы DIIMain").
Так что выход один: позаботиться о том, чтобы на момент выгрузки никакие потоки не завершались.
Т.е. надо стопать коннект до выгрузки.


чем стопить лучше qhttp? abort? close?

добавлено спустя 13 минут:

 Не помогает abort() Грустный Вызываю вручную, нажатием на кнопку. А потом только удаляю объект.
Записан
QCasper
Гость
« Ответ #9 : Апрель 04, 2007, 10:49 »

Я тут заметил одну вещь. Если сразу не пытаться выгружать плагин, а дождаться пока не завершаться три каких-то потока, это видно в output во время debag'a в VS, то плагин выгружается нормально. В связи с этим у меня вопрос, можно ли как-то получить эти потоки и насильно их замочить? Причем могу уверенно сказать, что http коннекта к хосту точно нет. То есть сначала я вижу сигнал stateChanged(state) где state == 0 (Unconnected), а только через время, вижу в аутпуте как эти три потока завершаются.
Записан
Tonal
Гость
« Ответ #10 : Апрель 05, 2007, 12:09 »

Попробуй до загрузки плагина создать подключение - а удалить после.
Может поможет.
А вообще-то, надо делать минимальный пример и писать Тролям.
Записан
QCasper
Гость
« Ответ #11 : Апрель 17, 2007, 15:52 »

Цитата: "Tonal"
Попробуй до загрузки плагина создать подключение - а удалить после.
Может поможет.
А вообще-то, надо делать минимальный пример и писать Тролям.


Здрасьте, а как это, у меня плагин отвечает за подключение, приложение и не знает даже чем там он занимается Улыбающийся Оно только загружает его, говорит: "работай давай", потом говорит: "все, хорош", и выгружает его Улыбающийся
Записан
Tonal
Гость
« Ответ #12 : Апрель 19, 2007, 13:25 »

Можно так извратиться:
1) приложение загружает плагин
2) плагин говорит приложению - инициализируй мине сеточку
3) приложение инициализирует
4) плагин работает
5) приложение выгружает плагин
Вот здесь приложение может стопнуть сеть...
Записан
QCasper
Гость
« Ответ #13 : Апрель 23, 2007, 14:19 »

Цитата: "Tonal"
Можно так извратиться:
1) приложение загружает плагин
2) плагин говорит приложению - инициализируй мине сеточку
3) приложение инициализирует
4) плагин работает
5) приложение выгружает плагин
Вот здесь приложение может стопнуть сеть...


Да не, беспонтово. Говорю же приложение не должно ничего знать о работе плагина, потому что плагинов много и все они разные, и переписывать каждый раз приложение под нужды каждого нового плагина - не очень прикольно. Само понятие плагины теряет всякий смысл, проще тогда уж приложение расширять.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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