Здравствуйте, гость ( Вход | Регистрация )
|
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
|
Посмотри обсуждение:
Link Думаю будет достаточно просто создать объект QCoreApplication, хотя бы статически, в dll. |
|
|
|
| Гость_Гость_evg123_*_* |
9.6.2010, 20:16
Сообщение
#3
|
|
Гости |
Цитата(BRE @ 9.6.2010, 15:50) Link Посмотри обсуждение: Думаю будет достаточно просто создать объект QCoreApplication, хотя бы статически, в dll. Это уже пробовали (очччень многие) - не работает. |
|
|
|
|
BRE |
9.6.2010, 20:24
Сообщение
#4
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44
|
Цитата(Гость_evg123_* @ 9.6.2010, 21:16) Link Это уже пробовали (очччень многие) - не работает. А что и как пробовали (эти многие)? Сообщение отредактировал BRE - 9.6.2010, 20:24 |
|
|
|
| Гость_Гость_evg123_*_* |
9.6.2010, 20:29
Сообщение
#5
|
|
Гости |
Цитата(BRE @ 9.6.2010, 20:24) Link Цитата(Гость_evg123_* @ 9.6.2010, 21:16) Link Это уже пробовали (очччень многие) - не работает. А что и как пробовали (эти многие)? Да я в нете много подобных обсуждений встречал на эту тему. (Не могу сейчас указать ссылки) на 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
|
Цитата(hkarel @ 9.6.2010, 21:53) Link Можно попробовать механизм локальной очереди сообщений. У меня была (есть) задача в которой нужно было иметь локальную очередь он без QEventLoop. Думаю, что этот механизм может подойти и для вашего случая. Если интересно могу поделиться исходниками, ну и как это дело юзать. У меня тоже всегда трэды общались между собой очередями. Даже класс для этого придумал. Тут проблем до сих пор не было. Но вот сейчас пользуюсь некими классами - наследниками от QIODevice, в которых сигналы реализованы (типа bytesWritten, readyRead), а блокирующие методы (типа waitBytesWritten и waitReadyRead) - не реализованы. А используется этот класс в моём дээльэльном трэде. Надо либо использовать механизм сигналов и слотов, либо, как вы говорите - свои очереди и самому дописывать блокирующие методы. Пока пошёл по второму пути - всё работает. Но первый путь всё равно интересен, т.к. это возможность открывать всякие окошки (модальные - простой вариант, не модальные - более сложный вариант) изнутри dll-лины - здесь уже без сигналов и слотов никак не обойтись. Для BRE: вот ссылка, про которую я говорил (что типа многие уже пробовали): Link |
|
|
|
|
BRE |
10.6.2010, 9:41
Сообщение
#8
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44
|
Цитата(evg123 @ 10.6.2010, 10:12) Link Для BRE: вот ссылка, про которую я говорил (что типа многие уже пробовали): Link В выводе этой примера Qt прямо кричит о причине. Так делать не нужно. |
|
|
|
evg123 Как внедрить QEventLoop внутрь dll 9.6.2010, 15:23

hkarel Ну, я так понимаю, раз вы уже имеете опыт работы с... 10.6.2010, 9:41

evg123 Вроде есть стандартное решение проблемы:
взято в h... 10.6.2010, 9:43

hkarel Цитата(evg123 @ 10.6.2010, 10:43) Но, (ё-... 11.6.2010, 10:26
Гость_evg123_* Прочитал ссылку. Будем пробовать. 9.6.2010, 20:24
alex977 evg123,
посмотри здесь:
http://qt.nokia.com/produc... 11.6.2010, 10:41
evg123 Цитата(alex977 @ 11.6.2010, 11:41) evg123... 15.6.2010, 11:15![]() ![]() ![]() |
|
Текстовая версия | Сейчас: 1.1.2026, 20:57 |