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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как узнать конфигурацию приложения Qt по параметрам секции CONFIG в файле pro ?  (Прочитано 5212 раз)
Zmeishe
Гость
« : Ноябрь 17, 2011, 12:20 »

Есть библиотека so/dll
Из неё необходимо узнать тип вызвавшего её приложения.
Это несложно.

Код:
  if( QApplication::type() == QApplication::Tty) 
  {
         ...
  }

  if( QApplication::type() == QApplication::GuiClient)
  {
         ...
  }

А как узнать, что вызвавшее приложение было собрано с определённой конфигурацией ?

Код:
QT = core \
    gui
CONFIG += qt \
    release \
    thread


Важно узнать был в секции CONFIG параметр thread или нет, чтобы библиотечные функции адекватно реагировали
на многопоточные приложения. Иначе приходиться в библиотечные классы добавлять свойство
bool isMultiThread;
А в приложениях помнить, что перед запуском потоков это свойство нужно установить в true, чтобы библиотека не показывала диалоги, а высылала сигналы с сообщениями для вывода их в главное окно вызвавшего приложения;
Записан
Akon
Гость
« Ответ #1 : Ноябрь 17, 2011, 14:01 »

А если вызывающее приложение собиралось не qmake, а другой системой сборки? Экспортируйте из либы оба интерфейса. Можете также сделать macro switching. Пример: char, wchar_t, TCHAR, соответственно printf, wprintf, _tprintf (gcc).
Записан
Zmeishe
Гость
« Ответ #2 : Ноябрь 21, 2011, 09:10 »

А если для Gui приложений использовать

QApplication::mainWidget()

и сравнить его поток с потоком класса внутри библиотеки?


Вот как-то так:
Код:
void QMyLibObject::myProcess()
{
if( QApplication::type() == QApplication::GuiClient && QApplication::mainWidget() )
  {
         if( QApplication::mainWidget()->thread() == thread() )
           {
               ...
           } else return;
  }
}

То есть, если создан объект (указатель) класса, описанного(находящегося) в  библиотеке и поток этого наследника от QObject  совпадает с потоком mainWidget(), то это одно поточное приложение.
Если потоки разные, то это много поточное приложение.

Это будет правильно?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Ноябрь 21, 2011, 09:33 »

А если для Gui приложений использовать

QApplication::mainWidget()
Наверное всё-таки не стоит советовать Qt3Support метод.
Записан

Qt 5.11/4.8.7 (X11/Win)
Zmeishe
Гость
« Ответ #4 : Ноябрь 21, 2011, 09:54 »

А ещё есть способы выявить много поточность приложения?
Записан
BRE
Гость
« Ответ #5 : Ноябрь 21, 2011, 11:38 »

Так может лучше что бы само приложение сообщала все о себе, вызывая одну из функций библиотеки с определенными параметрами?
Записан
Zmeishe
Гость
« Ответ #6 : Ноябрь 21, 2011, 11:46 »

Это, как раз, реализовано.
В библиотечном классе есть параметр bool isMultiThread;

Но если другой разработчик забудет его выставить/изменить, то
много поточное приложение с Гуями будет непредсказуемо падать.
Чем больше будет потоков, тем быстрее оно будет падать.
Точнее не падать, а Linux его  будет прибивать из-за конфликта в Иксах.
Я хотел найти способ определения одно и много поточности независимо от
склероза других разработчиков.
 
Записан
BRE
Гость
« Ответ #7 : Ноябрь 21, 2011, 11:57 »

Я хотел найти способ определения одно и много поточности независимо от
склероза других разработчиков.
Ну так сделай невозможным создать экземпляр этого класса без указания конфигурации - введи параметр о конфигурации в конструктор.
Код
C++ (Qt)
MyClass *cls = new MyClass( OPT_MULTITHREAD | OPT_GUI );
 
« Последнее редактирование: Ноябрь 21, 2011, 12:00 от BRE » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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