Как внедрить QEventLoop внутрь dll, Dll будет юзаться со стороны дельфи либо MFC-приложения |
Здравствуйте, гость ( Вход | Регистрация )
Как внедрить QEventLoop внутрь dll, Dll будет юзаться со стороны дельфи либо MFC-приложения |
evg123 |
9.6.2010, 15:23
Сообщение
#1
|
Студент Группа: Участник Сообщений: 24 Регистрация: 29.4.2009 Из: Минск Пользователь №: 714 Спасибо сказали: 0 раз(а) Репутация: 0 |
Есть вопрос буквально на засыпку.
Внутрь Dll вставляю QThread. В QThread в run() вставляю exec(). Этот трэд внутри dll-лины обрабатывет сигналы, которые ему генерируют другие трэды, тоже запущенные внутри этой dll-ли (у них метод run() не имеет exec() а реализован в виде безконечного цикла который время от времени генерирует сигналы, подхатываемые и обрабатываемые первым трэдом. ниодин из сигналов (логически) не выходит за рамки dll-ли. Теперь вопрос: Если я линкую эту dll c приложением, которе имеет запущенный QCoreApplication, то всё отрабатываеат просто супер! Если же я пишу некое приложение, которое не имеет запущенной QCoreApplication - то при попытке запустить трэды внутри моей dll-лины возникает ошибка типа QEventLoop: cannot work without QCoreApplication. И никакие сигналы направленные в мой первый трэд не обрабатываются его слотами. Вопрос в принцыпе легко решается - пиши головную программу на Qt, запускай QApplication.exec(), далее загружай dll-ку и всё тут. Да не тут то было. Головная программа написана одна - на дельфи, а другая на MFC. Рыл в нете, какие-то обрывки информации по поводу этой проблемы видел - но никаки конкретных ответов. Народ говорит, что да - такая проблема существует, но толком как её решить или обойти - я на счёт этого ничего не нашёл. Получается что этим замечательным механизмом сигналов и слотов в моём случае я воспользоваться не могу что ли? |
|
|
BRE |
9.6.2010, 15:50
Сообщение
#2
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Посмотри обсуждение:
http://www.prog.org.ru/topic_7223_0.html Думаю будет достаточно просто создать объект QCoreApplication, хотя бы статически, в dll. |
|
|
Гость_Гость_evg123_*_* |
9.6.2010, 20:16
Сообщение
#3
|
Гости |
|
|
|
BRE |
9.6.2010, 20:24
Сообщение
#4
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
|
|
|
Гость_Гость_evg123_*_* |
9.6.2010, 20:29
Сообщение
#5
|
Гости |
Это уже пробовали (очччень многие) - не работает. А что и как пробовали (эти многие)? Да я в нете много подобных обсуждений встречал на эту тему. (Не могу сейчас указать ссылки) на www.qtcenter.org и ещё кое-где. Просто набрал в гугле что-то типа "QEventLoop in dll". Надо пробовать. Спасибо за совет. |
|
|
hkarel |
9.6.2010, 21:53
Сообщение
#6
|
Студент Группа: Участник Сообщений: 25 Регистрация: 25.5.2009 Пользователь №: 771 Спасибо сказали: 0 раз(а) Репутация: 0 |
Можно попробовать механизм локальной очереди сообщений. У меня была (есть) задача в которой нужно было иметь локальную очередь он без QEventLoop. Думаю, что этот механизм может подойти и для вашего случая. Если интересно могу поделиться исходниками, ну и как это дело юзать.
|
|
|
evg123 |
10.6.2010, 9:12
Сообщение
#7
|
Студент Группа: Участник Сообщений: 24 Регистрация: 29.4.2009 Из: Минск Пользователь №: 714 Спасибо сказали: 0 раз(а) Репутация: 0 |
Можно попробовать механизм локальной очереди сообщений. У меня была (есть) задача в которой нужно было иметь локальную очередь он без QEventLoop. Думаю, что этот механизм может подойти и для вашего случая. Если интересно могу поделиться исходниками, ну и как это дело юзать. У меня тоже всегда трэды общались между собой очередями. Даже класс для этого придумал. Тут проблем до сих пор не было. Но вот сейчас пользуюсь некими классами - наследниками от QIODevice, в которых сигналы реализованы (типа bytesWritten, readyRead), а блокирующие методы (типа waitBytesWritten и waitReadyRead) - не реализованы. А используется этот класс в моём дээльэльном трэде. Надо либо использовать механизм сигналов и слотов, либо, как вы говорите - свои очереди и самому дописывать блокирующие методы. Пока пошёл по второму пути - всё работает. Но первый путь всё равно интересен, т.к. это возможность открывать всякие окошки (модальные - простой вариант, не модальные - более сложный вариант) изнутри dll-лины - здесь уже без сигналов и слотов никак не обойтись. Для BRE: вот ссылка, про которую я говорил (что типа многие уже пробовали): http://stackoverflow.com/questions/1786438...t-loop-problems |
|
|
evg123 |
10.6.2010, 9:43
Сообщение
#8
|
Студент Группа: Участник Сообщений: 24 Регистрация: 29.4.2009 Из: Минск Пользователь №: 714 Спасибо сказали: 0 раз(а) Репутация: 0 |
Вроде есть стандартное решение проблемы:
взято в http://doc.qt.nokia.com/solutions/4/qtwinm...#pluginInstance Самый конец страницы. Но, (ё-моё), гдеж взять этот класс QMfcApp? В коммерческой версии что-ль? bool QMfcApp::pluginInstance ( Qt::HANDLE plugin = 0 ) [static] If there is no global QApplication object (i.e. qApp is null) this function creates a QApplication instance and returns true; otherwise it does nothing and returns false. The application installs an event filter that drives the Qt event loop while the MFC or Win32 application continues to own the event loop. Use this static function if the application event loop code can not be easily modified, or when developing a plugin or DLL that will be loaded into an existing Win32 or MFC application. If plugin is non-null then the function loads the respective DLL explicitly to avoid unloading from memory. BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpvReserved) { if (dwReason == DLL_PROCESS_ATTACH) QMfcApp::pluginInstance(hInstance); return TRUE; } Set plugin to 0 when calling this function from within the same executable module. If this function is used, call enterModalLoop and exitModalLoop whenever you call a Win32 or MFC function that opens a local event loop. void Dialog::someSlot() { QMfcApp::enterModalLoop(); MessageBox(...); QMfcApp::exitModalLoop(); } |
|
|
Текстовая версия | Сейчас: 23.12.2024, 2:53 |