Russian Qt Forum

Qt => Работа с сетью => Тема начата: ufna от Ноябрь 09, 2012, 21:56



Название: QXMPP внутри DLL'ки
Отправлено: ufna от Ноябрь 09, 2012, 21:56
Всем привет! :)

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

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

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

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

Есть какие-нибудь идеи в какую сторону копать?


Название: Re: QXMPP внутри DLL'ки
Отправлено: ufna от Ноябрь 10, 2012, 00:30
Вопрос снимается - обернул клиент в отдельный тред.


Название: Re: QXMPP внутри DLL'ки
Отправлено: ufna от Ноябрь 10, 2012, 01:12
А, нет, проблема в силе :(


Название: Re: QXMPP внутри DLL'ки
Отправлено: Bepec от Ноябрь 10, 2012, 09:41
Попробовать сделать полный дисконнект? К сожалению знаком с ним очень поверхностно.

PS мб стоит вызывать qApp->exit(0) этого потока?


Название: Re: QXMPP внутри DLL'ки
Отправлено: ufna от Ноябрь 10, 2012, 12:35
Не помогает.

Особенность такова:
если exit потока (или всего qApp) вызвать _перед_ дисконнектом, то функция disconnectFromServer обрабатывается быстро, все доходит до конца, и висит.
если exit'а потока не было "до", то disconnectFromServer "висит" (что странно).


Название: Re: QXMPP внутри DLL'ки
Отправлено: ufna от Ноябрь 10, 2012, 12:40
Новая особенность - в конце "подчистки" я удаляю созданный ранее QApplication, а т.е.
Код:
        if(pApp)
            delete pApp;


Как оказалось, виснет именно эта строка. Удивлен О_о


Название: Re: QXMPP внутри DLL'ки
Отправлено: Bepec от Ноябрь 10, 2012, 12:51
А его разве можно удалять? Помоему его exit'тить надо.


Название: Re: QXMPP внутри DLL'ки
Отправлено: ufna от Ноябрь 10, 2012, 13:20
удалять можно

вообще я его не exec()'аю нигде. Сейчас сделал так, что exec() вставляю в самом конце функции очистки, далее по таймеру синглшотов ему quit(). Лог собирать на этом я уже не могу, но оно просто падает.


Название: Re: QXMPP внутри DLL'ки
Отправлено: ufna от Ноябрь 11, 2012, 15:18
Единственное найденное упоминание в вебе о сходной проблеме: http://lists.trolltech.com/qt-interest/2007-03/thread00011-0.html



Название: Re: QXMPP внутри DLL'ки
Отправлено: ufna от Ноябрь 11, 2012, 17:04
Убил лишнее, проблема не решена  ;D


Название: Re: QXMPP внутри DLL'ки
Отправлено: Bepec от Ноябрь 11, 2012, 18:22
Мини проектик мб?


Название: Re: QXMPP внутри DLL'ки
Отправлено: ufna от Ноябрь 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 (тут кода минимум оставлено)