Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Zmeishe от Ноябрь 17, 2011, 12:20



Название: Как узнать конфигурацию приложения Qt по параметрам секции CONFIG в файле pro ?
Отправлено: 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, чтобы библиотека не показывала диалоги, а высылала сигналы с сообщениями для вывода их в главное окно вызвавшего приложения;


Название: Re: Как узнать конфигурацию приложения Qt по параметрам секции CONFIG в файле pro ?
Отправлено: Akon от Ноябрь 17, 2011, 14:01
А если вызывающее приложение собиралось не qmake, а другой системой сборки? Экспортируйте из либы оба интерфейса. Можете также сделать macro switching. Пример: char, wchar_t, TCHAR, соответственно printf, wprintf, _tprintf (gcc).


Название: Re: Как узнать конфигурацию приложения Qt по параметрам секции CONFIG в файле pro ?
Отправлено: Zmeishe от Ноябрь 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(), то это одно поточное приложение.
Если потоки разные, то это много поточное приложение.

Это будет правильно?


Название: Re: Как узнать конфигурацию приложения Qt по параметрам секции CONFIG в файле pro ?
Отправлено: GreatSnake от Ноябрь 21, 2011, 09:33
А если для Gui приложений использовать

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


Название: Re: Как узнать конфигурацию приложения Qt по параметрам секции CONFIG в файле pro ?
Отправлено: Zmeishe от Ноябрь 21, 2011, 09:54
А ещё есть способы выявить много поточность приложения?


Название: Re: Как узнать конфигурацию приложения Qt по параметрам секции CONFIG в файле pro ?
Отправлено: BRE от Ноябрь 21, 2011, 11:38
Так может лучше что бы само приложение сообщала все о себе, вызывая одну из функций библиотеки с определенными параметрами?


Название: Re: Как узнать конфигурацию приложения Qt по параметрам секции CONFIG в файле pro ?
Отправлено: Zmeishe от Ноябрь 21, 2011, 11:46
Это, как раз, реализовано.
В библиотечном классе есть параметр bool isMultiThread;

Но если другой разработчик забудет его выставить/изменить, то
много поточное приложение с Гуями будет непредсказуемо падать.
Чем больше будет потоков, тем быстрее оно будет падать.
Точнее не падать, а Linux его  будет прибивать из-за конфликта в Иксах.
Я хотел найти способ определения одно и много поточности независимо от
склероза других разработчиков.
 


Название: Re: Как узнать конфигурацию приложения Qt по параметрам секции CONFIG в файле pro ?
Отправлено: BRE от Ноябрь 21, 2011, 11:57
Я хотел найти способ определения одно и много поточности независимо от
склероза других разработчиков.
Ну так сделай невозможным создать экземпляр этого класса без указания конфигурации - введи параметр о конфигурации в конструктор.
Код
C++ (Qt)
MyClass *cls = new MyClass( OPT_MULTITHREAD | OPT_GUI );