Как внедрить 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:24
Сообщение
#5
|
Гости |
Прочитал ссылку. Будем пробовать.
|
|
|
Гость_Гость_evg123_*_* |
9.6.2010, 20:29
Сообщение
#6
|
Гости |
Это уже пробовали (очччень многие) - не работает. А что и как пробовали (эти многие)? Да я в нете много подобных обсуждений встречал на эту тему. (Не могу сейчас указать ссылки) на www.qtcenter.org и ещё кое-где. Просто набрал в гугле что-то типа "QEventLoop in dll". Надо пробовать. Спасибо за совет. |
|
|
hkarel |
9.6.2010, 21:53
Сообщение
#7
|
Студент Группа: Участник Сообщений: 25 Регистрация: 25.5.2009 Пользователь №: 771 Спасибо сказали: 0 раз(а) Репутация: 0 |
Можно попробовать механизм локальной очереди сообщений. У меня была (есть) задача в которой нужно было иметь локальную очередь он без QEventLoop. Думаю, что этот механизм может подойти и для вашего случая. Если интересно могу поделиться исходниками, ну и как это дело юзать.
|
|
|
evg123 |
10.6.2010, 9:12
Сообщение
#8
|
Студент Группа: Участник Сообщений: 24 Регистрация: 29.4.2009 Из: Минск Пользователь №: 714 Спасибо сказали: 0 раз(а) Репутация: 0 |
Можно попробовать механизм локальной очереди сообщений. У меня была (есть) задача в которой нужно было иметь локальную очередь он без QEventLoop. Думаю, что этот механизм может подойти и для вашего случая. Если интересно могу поделиться исходниками, ну и как это дело юзать. У меня тоже всегда трэды общались между собой очередями. Даже класс для этого придумал. Тут проблем до сих пор не было. Но вот сейчас пользуюсь некими классами - наследниками от QIODevice, в которых сигналы реализованы (типа bytesWritten, readyRead), а блокирующие методы (типа waitBytesWritten и waitReadyRead) - не реализованы. А используется этот класс в моём дээльэльном трэде. Надо либо использовать механизм сигналов и слотов, либо, как вы говорите - свои очереди и самому дописывать блокирующие методы. Пока пошёл по второму пути - всё работает. Но первый путь всё равно интересен, т.к. это возможность открывать всякие окошки (модальные - простой вариант, не модальные - более сложный вариант) изнутри dll-лины - здесь уже без сигналов и слотов никак не обойтись. Для BRE: вот ссылка, про которую я говорил (что типа многие уже пробовали): http://stackoverflow.com/questions/1786438...t-loop-problems |
|
|
BRE |
10.6.2010, 9:41
Сообщение
#9
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Для BRE: вот ссылка, про которую я говорил (что типа многие уже пробовали): http://stackoverflow.com/questions/1786438...t-loop-problems В выводе этой примера Qt прямо кричит о причине. Так делать не нужно. |
|
|
hkarel |
10.6.2010, 9:41
Сообщение
#10
|
Студент Группа: Участник Сообщений: 25 Регистрация: 25.5.2009 Пользователь №: 771 Спасибо сказали: 0 раз(а) Репутация: 0 |
Ну, я так понимаю, раз вы уже имеете опыт работы с локальными очередями, мне свой "велосипед" показывать незачем
P.S. Кстати, в моем случае сигналы/слоты вовсе не исключаются, а активно используются (предпочтительно в режиме директ-коннект), в вашей ситуации, я думаю, этот тип коннекта единственно возможный. |
|
|
Текстовая версия | Сейчас: 22.12.2024, 10:53 |