crossplatform.ru

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

Гость_Артем_*
сообщение 6.11.2012, 14:00
Сообщение #1





Гости








    


Здравствуйте, уважаемые форумчане.

Есть задача написать кросплатформенную динамическую библиотеку, внутри которой задействованы многопоточность и сетевые взаимодействия. Конечно, qt привлекает своим функционалом, стабильностью, легкостью разработки и тд. Перечислять плюсы можно долго. Однако разрабатываемая бибилиотека должна линковаться к любым приложениям, независимо от того используют ли они qt или нет.

И в этом загводка. Для работы Qt требуется объект QApplication или QCoreApplication, которые создают петлю событий, обрабатывают события от ОС и др источников, запускают обработку очереди событий и тд. Этот объект создается в main(). Если приложение, основано на qt, то все в порядке. А если нет.. Где его создавать и возможно ли это? Можно ли сделать такую библиотеку?

Заранее спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 9)
Алексей1153
  опции профиля:
сообщение 6.11.2012, 14:35
Сообщение #2


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

Группа: Участник
Сообщений: 2944
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


петля сообщений нужна только для GUI , взамодействие же по сети и многопоточные вычисления вовсе не требуют GUI.

Сообщение отредактировал Алексей1153 - 6.11.2012, 14:35
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 6.11.2012, 14:59
Сообщение #3





Гости








    


QTcpSocket требует и таймер тоже.. И можно ли вообще не создавать объект QCoreApplication?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 6.11.2012, 16:51
Сообщение #4


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

Группа: Участник
Сообщений: 2944
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


а зачем ему таймер ? Цикл вычитки из сокета надо организовать. Ну и разбавлять небольшим слипом, когда простаивает (ну это в зависимости от задачи)

Вообще говоря, я под Qt с сокетами не работал, только в WinAPI - там всё по простенькому (в том смысле, что точно никакой петли не надо и никаких окон вообще)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 6.11.2012, 21:53
Сообщение #5


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

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


Цитата(Гость_Артем_* @ 6.11.2012, 15:00) *
Если приложение, основано на qt, то все в порядке. А если нет.. Где его создавать и возможно ли это? Можно ли сделать такую библиотеку?
Для полноценной работы всего что унаследовано от QObject нужна петля событий, которая создаётся при вызове QApplication::exec() или QCoreApplication::exec(). Можно попробовать создавать локальную петлю при помощи QEventLoop. Но на мой взгляд, если вы и получите желаемый результат, выглядеть это будет не очень красиво. Лучше выбрать другую кроссплатформенную библиотеку, например boost.

P.S. Более того, просто без создания экземпляра QCoreApplication некоторые части Qt не работают так как ожидается.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 7.11.2012, 14:52
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(Гость_Гость_* @ 6.11.2012, 16:59) *
И можно ли вообще не создавать объект QCoreApplication?
нет, но его можно создавать в библиотеке. Где-то был на форуме пример, как сделать библиотеку, которая проверяет: Если ещё QCoreApplication не существует, то создать его.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Артем_*
сообщение 7.11.2012, 16:31
Сообщение #7





Гости








    


Цитата(Litkevich Yuriy @ 7.11.2012, 14:52) *
Цитата(Гость_Гость_* @ 6.11.2012, 16:59) *
И можно ли вообще не создавать объект QCoreApplication?
нет, но его можно создавать в библиотеке. Где-то был на форуме пример, как сделать библиотеку, которая проверяет: Если ещё QCoreApplication не существует, то создать его.

Не будет ли создание QCoreApplication как то влиять на работу основной программы, к которой линкуется библиотека? К примеру будут перехватываться события ОС или еще что-нить?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 7.11.2012, 16:47
Сообщение #8





Гости








    


Так я понимаю вызов exec() это и есть запуск QeventLoop внутри QThread.

Пробовал запускать петлю событий в библиотеке, где создавал объект, наследуясь от QThread. При линковке библиотеки к обычному (не qt-шному) консольному приложению. пишет в консоль
QEventLoop cannot be used without QApplication

таймер при этом не работает, но при этом поток в методе run() входит в exec() и не выходит из нее до вызова quit().
пробовал переносить таймер и в основной и в рабочий поток, используя moveToThread(), все ра вно не работает.

При этом при линковке бибилиотеки с qt-приложением все работает как часы.
При добавлении в библиотеку QCoreApplication тоже все работает.

Вопрос соответственно сводится к следующему: не влияет ли создание QCoreApplication на основную программу?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 7.11.2012, 22:11
Сообщение #9


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

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


QCoreApplication - это "singleton". Что бы узнать создан ли он можно воспользоваться следующей функцией
Цитата(assistant)
QCoreApplication * QCoreApplication::instance () [static]
Returns a pointer to the application's QCoreApplication (or QApplication) instance.

If no instance has been allocated, null is returned.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Артем_*
сообщение 8.11.2012, 9:26
Сообщение #10





Гости








    


Да, Игорь, я знаю, что QCoreApplication - это "singleton", вопрос у меня в том не будет ли создание объекта QCoreApplication в библиотеке влиять на основную программу, к которой линкуется библиотека?
К примеру основная программа будет строиться на GTK+ или еще какой либо библиотеки, будет иметь свою петлю событий и свой аналог QCoreApplication ( в GTK+ функция gtk_init(&argc, &argv))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 11.7.2025, 12:21