Russian Qt Forum
Ноябрь 25, 2024, 07:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Библиотека на Qt в не Qt-приложении  (Прочитано 7186 раз)
OKTA
Гость
« : Февраль 12, 2015, 11:34 »

Читал тему Вереса об одном из способов, как заставить библиотеку на Qt работать в не Qt-приложении. Однако подход оказался не очень кроссплатформенным (или я не заметил чего?  Смеющийся)
Так вот, хотелось бы узнать, есть ли подвижки в этом направлении?
Делаю библиотеку у которой интерфейс в виде абстрактного класса с двумя виртуальными функциями, которые должны дергаться из библиотеки по приходу каких-либо событий. Внутри библиотеки все построено на сигналах-слотах - для этого все основное суется в QThread, создается QCoreApplication и вроде бы даже работает. Но проблема в том, что когда надо вызвать виртуальную функцию, возникает курьезная ситуация. Интерфейсный класс работает в потоке основного приложения, а все библиотечное во внутреннем потоке библиотеки. И на этом стыке получается, что виртуальные функции могут дергаться только в контексте потока библиотеки, чего быть не должно  Плачущий
Надеюсь, более-менее понятно написал  Непонимающий
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #1 : Февраль 12, 2015, 11:39 »

Делай очередь команд в поток.

Ну или через QCoreApplication::postEvent..
Записан

Гугль в помощь
OKTA
Гость
« Ответ #2 : Февраль 12, 2015, 11:52 »

Не очень понятно про очередь команд.
А после postEvent делать где-нибудь processEvents?
Записан
Bepec
Гость
« Ответ #3 : Февраль 12, 2015, 12:38 »

Да, способ изначально не кроссплатформенный, ибо работать он должен(и работает к моей радости) только на Windows Улыбающийся

С линями и униксами у меня проблемы в отношениях, так что ничем не могу помочь Улыбающийся

Почему же курьёзная ситуация? Вполне нормальное поведение системы сигнал слотов - разные потоки, следовательно соединение через очередь, вызов в контекте потока родителя (в данном случае qthread).

Вы чего хотите то? конкретный вопрос дайте.

PS а так возврат данных из класса из dll обычно делается с граблями и костылями - callback функции, пересылка event'ов, чтение по таймеру переменной состояния и прочее Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Февраль 12, 2015, 12:40 »

Но проблема в том, что когда надо вызвать виртуальную функцию, возникает курьезная ситуация. Интерфейсный класс работает в потоке основного приложения, а все библиотечное во внутреннем потоке библиотеки. И на этом стыке получается, что виртуальные функции могут дергаться только в контексте потока библиотеки, чего быть не должно  Плачущий
Не понял проблемы, лучше простой пример
Записан
OKTA
Гость
« Ответ #5 : Февраль 12, 2015, 13:00 »

Краткое описание проблемы.
1. Имеется интерфейсный класс библиотеки с двумя виртуальными функциями.
2. Эти функции вызываются из библиотеки по приходу каких-либо событий.
3. Эти функции должны работать в контексте потока приложения.
4. Вся работа внутри библиотеки выполняется в отдельном потоке (который внутри библиотеки и создается).
5. Как соединить сигнал из потока с QEventLoop с функцией в потоке без QEventLoop, чтобы функция вызвалась как раз в контексте потока без QEventLoop, т.е. в контексте приложения?
6. Приложение не предусматривает работы с Qt.
Записан
Bepec
Гость
« Ответ #6 : Февраль 12, 2015, 13:10 »

Хм. вам нужны Qt функции в неQt потоке? с сигналами и слотами? да вы, батенька, зажрались.

Как дернуть ф-цию из одного потока в другом потоке - никак, если это не предусмотрено архитектурой приложения.
Записан
OKTA
Гость
« Ответ #7 : Февраль 12, 2015, 13:22 »

Новость о том, что основное приложение не на Qt поступила слишком поздно, вот и захотелось зажраться  Смеющийся

Счастье свалилось неожиданно - приемную сторону устроит контекст потока библиотеки  Смеющийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.112 секунд. Запросов: 22.