crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Как внедрить 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, 15:50) *
Посмотри обсуждение:
Думаю будет достаточно просто создать объект QCoreApplication, хотя бы статически, в dll.

Это уже пробовали (очччень многие) - не работает.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 9.6.2010, 20:24
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Гость_evg123_* @ 9.6.2010, 21:16) *
Это уже пробовали (очччень многие) - не работает.

А что и как пробовали (эти многие)?


Сообщение отредактировал BRE - 9.6.2010, 20:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_evg123_*_*
сообщение 9.6.2010, 20:24
Сообщение #5





Гости








    


Прочитал ссылку. Будем пробовать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_evg123_*_*
сообщение 9.6.2010, 20:29
Сообщение #6





Гости








    


Цитата(BRE @ 9.6.2010, 20:24) *
Цитата(Гость_evg123_* @ 9.6.2010, 21:16) *
Это уже пробовали (очччень многие) - не работает.

А что и как пробовали (эти многие)?

Да я в нете много подобных обсуждений встречал на эту тему. (Не могу сейчас указать ссылки) на 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  


Цитата(hkarel @ 9.6.2010, 21:53) *
Можно попробовать механизм локальной очереди сообщений. У меня была (есть) задача в которой нужно было иметь локальную очередь он без 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  


Цитата(evg123 @ 10.6.2010, 10:12) *
Для BRE: вот ссылка, про которую я говорил (что типа многие уже пробовали):
http://stackoverflow.com/questions/1786438...t-loop-problems

В выводе этой примера Qt прямо кричит о причине.
Так делать не нужно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
hkarel
  опции профиля:
сообщение 10.6.2010, 9:41
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 25
Регистрация: 25.5.2009
Пользователь №: 771

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ну, я так понимаю, раз вы уже имеете опыт работы с локальными очередями, мне свой "велосипед" показывать незачем :D

P.S. Кстати, в моем случае сигналы/слоты вовсе не исключаются, а активно используются (предпочтительно в режиме директ-коннект), в вашей ситуации, я думаю, этот тип коннекта единственно возможный.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.4.2024, 21:42