Название: Цикл сообщений в DLL Отправлено: Ground от Февраль 22, 2012, 15:23 Доброго времени суток!
У меня есть DLL, в ней есть мой самописный сетевой класс Client. Объект класса я создаю прямо в DLL. Чтобы класс работал, мне нужно в этой же DLL создать цикл сообщений. Я пробовал делать вот например так: Код Т.е. в DLLMain создаю QCoreApplication (если его еще нет) и запускаю отдельный поток, запускает exec() для QCoreApplication. Результата - ноль. Еще пробовал делать вместо QCoreApplication::exec() просто в отдельном потоке в бесконечном цикле гонять qApp->processEvents(); Тоже не работает. В чем может быть дело, не подскажете? Кстати вот, я делаю как этот товарищ: http://www.prog.org.ru/topic_2148_0.html Название: Re: Цикл сообщений в DLL Отправлено: Rem Norton от Февраль 22, 2012, 16:21 Ну как бы цикл сообщений - это QEventLoop.
Только совсем не понятно зачем. В чем смысл жизни этой DLL-ки? Как я понимаю запустить некий поток. Название: Re: Цикл сообщений в DLL Отправлено: Ground от Февраль 22, 2012, 16:32 Смысл DLL в том, чтобы перенести функционал работы с сетью на приложение под VS2010. То есть из DLL торчит интерфейс, вроде такого:
Код
Человек, работая с VS, подключает мою либу, вызывает эти функции и работает с сервером. Либу я сделал, начинаю тестировать. После вызова метода connectToServer, сокет зависает в состоянии Connecting. Если бы был цикл обработки сообщений - сработал бы сигнал, сокет переключился в состояние Connected. Вот такая вот беда. Название: Re: Цикл сообщений в DLL Отправлено: neversleep от Февраль 22, 2012, 18:42 Пишите приложение под венду? :)
Хотите работать с сетью? :D Устали вставлять костыли? >:( Тогда winsock - ваш выбор! 8) Название: Re: Цикл сообщений в DLL Отправлено: Rem Norton от Февраль 22, 2012, 19:23 Смысл DLL в том, чтобы перенести функционал работы с сетью на приложение под VS2010. То есть из DLL торчит интерфейс, вроде такого: А экспортнуть из DLL экземпляр класса и запустить в приложении не пробовал?Код
Человек, работая с VS, подключает мою либу, вызывает эти функции и работает с сервером. Либу я сделал, начинаю тестировать. После вызова метода connectToServer, сокет зависает в состоянии Connecting. Если бы был цикл обработки сообщений - сработал бы сигнал, сокет переключился в состояние Connected. Вот такая вот беда. ИМХО: проблемму сам себе создал, причем совершенно на пустом месте. Название: Re: Цикл сообщений в DLL Отправлено: Ground от Февраль 23, 2012, 04:29 Смысл DLL в том, чтобы перенести функционал работы с сетью на приложение под VS2010. То есть из DLL торчит интерфейс, вроде такого: А экспортнуть из DLL экземпляр класса и запустить в приложении не пробовал?Код
Человек, работая с VS, подключает мою либу, вызывает эти функции и работает с сервером. Либу я сделал, начинаю тестировать. После вызова метода connectToServer, сокет зависает в состоянии Connecting. Если бы был цикл обработки сообщений - сработал бы сигнал, сокет переключился в состояние Connected. Вот такая вот беда. ИМХО: проблемму сам себе создал, причем совершенно на пустом месте. Ну т.е. в либе только описание, а в основном приложении создаю экземпляр класса, описанного в либе? Так делать пробовал, это был самый первый вариант, после чего и пошли такие косяки Потом гуглил долго и тщательно, в итоге нашел, что народ предлагает создавать класс в самой DLL, и там же запускать цикл обработки сообщений. Только сколько я не пытаюсь это делать - ничего не получается. Название: Re: Цикл сообщений в DLL Отправлено: neversleep от Февраль 23, 2012, 05:48 Ну т.е. в либе только описание, а в основном приложении создаю экземпляр класса, описанного в либе? Так делать пробовал, это был самый первый вариант, после чего и пошли такие косяки Надо запустить event loop в том потоке, в котором создан сокет.Потом гуглил долго и тщательно, в итоге нашел, что народ предлагает создавать класс в самой DLL, и там же запускать цикл обработки сообщений. Только сколько я не пытаюсь это делать - ничего не получается. Код
Название: Re: Цикл сообщений в DLL Отправлено: Ground от Февраль 23, 2012, 06:11 Надо запустить event loop в том потоке, в котором создан сокет. Вот сделал так в DLL: Код
А в основной программе делаю так: Код
В принципе понятно, сокет асинхронный, запускается в своем треде 1. Тред в DLL - это 2. Тред 3 - это main в основной программе. Но как это обойти? Еще раз отмечу, в основном приложении не должно быть никакой информации о Qt. Название: Re: Цикл сообщений в DLL Отправлено: Rem Norton от Февраль 23, 2012, 09:05 Цитировать Еще раз отмечу, в основном приложении не должно быть никакой информации о Qt. Тогда делай CALLBACK. Название: Re: Цикл сообщений в DLL Отправлено: vregess от Февраль 23, 2012, 10:13 Тебе нежен qtsolutions.qtwinmigrate QMfcApp, если я правильно понял задачу.
Ну а создавать GUI поток не рекомендуют, тк GUI должен крутиться в главном потоке приложения. Название: Re: Цикл сообщений в DLL Отправлено: Ground от Февраль 23, 2012, 10:22 Тебе нежен qtsolutions.qtwinmigrate QMfcApp, если я правильно понял задачу. Да, это именно то, что мне нужно, спасибо за подсказку.Ну а создавать GUI поток не рекомендуют, тк GUI должен крутиться в главном потоке приложения. У меня конечно трудности с его сборкой, но я попробовал в его тестовом приложении развернуть свой код - и все заработало. Единственный минус - приходится тащить дополнительно QtGui4.dll, хотя мне достаточно было бы цикла из QtCore для консольки. Но после трех дней мучений - я и этому решению рад. А вот по поводу сборки, я делаю вот так: 1. configure 2. qmake buildlib.pro CONFIG+=release 3. nmake В итоге у меня 2 либы: qtwin.lib, qtwind.lib + .dll к ним + .pdb (инфо для отладчика). Все это добро я бросаю в папку с Qt, в Bin (dll + pdb) и в Lib (lib). И еще есть заголовочные файлы, их я тоже в папку к стандартным файликам Qt бросаю. В своем проекте подключаю только эти хедеры (в .pro ничего не меняю). Но в итоге у меня unresolved reference при компиляции. В чем тут дело? Название: Re: Цикл сообщений в DLL Отправлено: vregess от Февраль 23, 2012, 17:35 Чтобы не таскать с собой библиотеку solutions и QtGui можно сделать аналогичный функционал самому.
Исходник во вложении, дублирую тут. DLLWrapper.h Код
DLLWrapper.cpp Код
Пример использования: Код
|