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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QXMPP внутри DLL'ки  (Прочитано 7716 раз)
ufna
Гость
« : Ноябрь 09, 2012, 21:56 »

Всем привет! Улыбающийся

В общем, есть дллка, "обычная" (с BOOL WINAPI DllMain , extern C и __declspec(dllexport)). Внутри нее "живет" QXmppClient - в основном ее потоке. В общем все хорошо, работает, коннектится, проблем нет.

Проблема начинается когда дллка отрубается от основного приложения, а т.е. ловим DLL_PROCESS_DETACH и начинаем все за собой подчищать. Состоит проблема в том, что если QXmppClient просто "живет" - т.е. создан, заданы ему настройки и пр. - то все ок, он прибивается, вычищается, все отлично.

Если же было использовано хотя бы connectToServer, то функция подчистки обрабатывается целиком, но это все - после этого приложение основное остается висеть "навечно".

Дебажить "основное" приложение к сожалению никак + дллка подрубается в релизной сборке.

Есть какие-нибудь идеи в какую сторону копать?
Записан
ufna
Гость
« Ответ #1 : Ноябрь 10, 2012, 00:30 »

Вопрос снимается - обернул клиент в отдельный тред.
Записан
ufna
Гость
« Ответ #2 : Ноябрь 10, 2012, 01:12 »

А, нет, проблема в силе Грустный
Записан
Bepec
Гость
« Ответ #3 : Ноябрь 10, 2012, 09:41 »

Попробовать сделать полный дисконнект? К сожалению знаком с ним очень поверхностно.

PS мб стоит вызывать qApp->exit(0) этого потока?
Записан
ufna
Гость
« Ответ #4 : Ноябрь 10, 2012, 12:35 »

Не помогает.

Особенность такова:
если exit потока (или всего qApp) вызвать _перед_ дисконнектом, то функция disconnectFromServer обрабатывается быстро, все доходит до конца, и висит.
если exit'а потока не было "до", то disconnectFromServer "висит" (что странно).
Записан
ufna
Гость
« Ответ #5 : Ноябрь 10, 2012, 12:40 »

Новая особенность - в конце "подчистки" я удаляю созданный ранее QApplication, а т.е.
Код:
        if(pApp)
            delete pApp;


Как оказалось, виснет именно эта строка. Удивлен О_о
Записан
Bepec
Гость
« Ответ #6 : Ноябрь 10, 2012, 12:51 »

А его разве можно удалять? Помоему его exit'тить надо.
Записан
ufna
Гость
« Ответ #7 : Ноябрь 10, 2012, 13:20 »

удалять можно

вообще я его не exec()'аю нигде. Сейчас сделал так, что exec() вставляю в самом конце функции очистки, далее по таймеру синглшотов ему quit(). Лог собирать на этом я уже не могу, но оно просто падает.
Записан
ufna
Гость
« Ответ #8 : Ноябрь 11, 2012, 15:18 »

Единственное найденное упоминание в вебе о сходной проблеме: http://lists.trolltech.com/qt-interest/2007-03/thread00011-0.html

« Последнее редактирование: Ноябрь 11, 2012, 17:03 от ufna » Записан
ufna
Гость
« Ответ #9 : Ноябрь 11, 2012, 17:04 »

Убил лишнее, проблема не решена  Смеющийся
Записан
Bepec
Гость
« Ответ #10 : Ноябрь 11, 2012, 18:22 »

Мини проектик мб?
Записан
ufna
Гость
« Ответ #11 : Ноябрь 12, 2012, 13:03 »

Танцы с бубном, пересобрано и подключено все в дебаге, результат:
100500 сообщений QSocketNotifier: socket notifiers cannot be disabled from another thread  при завершении Грустный чего делать даже не знаю, лезть внутрь QXmpp наверное Грустный

Сам проект: https://dl.dropbox.com/u/15490650/Files/code_pack.7z (тут кода минимум оставлено)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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