Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: QuJu от Февраль 13, 2017, 01:08



Название: Запуск Qt GUI из не основного потока
Отправлено: QuJu от Февраль 13, 2017, 01:08
Здравствуйте,
 
 Такая проблема. Имеется основная программа(чужая), к которой цепляю Qt окно. Когда происходят тяжелые расчеты в основной программе, то интерфейс Qt начинает тормозить.
Пробую запускать Qt из основной программы в другом потоке с помощью boost::thread. Раздельно всё работает отлично, только не могу сделать общение между этими потоками.
Необходимо периодически передавать данные в обе стороны.
 Я начинающий в C++/Qt , поэтому следующие вопросы: 
 1. Допускается ли вообще так делать(сабж)?
 2. Возможно вариант с boost не самый лучший?
 3. Направьте каким образом наладить общение между потоками?


Название: Re: Запуск Qt GUI из не основного потока
Отправлено: Old от Февраль 13, 2017, 03:16
1. доускается.
2. boost::thread, std::thread,QThread это все обертки над системными нитками поэтому совершенно не важно кем создаются эти нитки.
3. а вот это зависит от самого общения (какие данные и когда должны передаваться между нитками).


Название: Re: Запуск Qt GUI из не основного потока
Отправлено: qate от Февраль 13, 2017, 08:36
по неясной постановке задачи можно предложить воспользоваться qprocess и обмен вести через stdin stdout



Название: Re: Запуск Qt GUI из не основного потока
Отправлено: QuJu от Февраль 13, 2017, 09:20
1. доускается.
2. boost::thread, std::thread,QThread это все обертки над системными нитками поэтому совершенно не важно кем создаются эти нитки.
3. а вот это зависит от самого общения (какие данные и когда должны передаваться между нитками).

2. Я так понял,что используя QThread я не смогу запустить QApp в другом потоке
3. Данные - QString и int. QString после нажатия кнопки в Qt  передается в чужую программу - она делает расчет и возвращает Qt результат Int.
Я пытался связать через QObject connect signal slot, делая наследниками от QObject класс который запускает сторонний поток и класс с qApp


Название: Re: Запуск Qt GUI из не основного потока
Отправлено: Old от Февраль 13, 2017, 10:08
2. Я так понял,что используя QThread я не смогу запустить QApp в другом потоке
Возможно да, но даже такое ограничение, что для создания объекта QThread возможно нужен инстант QApplication, не делает QThread не врапером системных ниток. :)

3. Данные - QString и int. QString после нажатия кнопки в Qt  передается в чужую программу - она делает расчет и возвращает Qt результат Int.
Я пытался связать через QObject connect signal slot, делая наследниками от QObject класс который запускает сторонний поток и класс с qApp
Как оформлено чужое приложение? Как вы передаете ему QString, вызывая функцию/метод? Как это приложение сообщает о завершении расчетов?


Название: Re: Запуск Qt GUI из не основного потока
Отправлено: QuJu от Февраль 13, 2017, 16:38

Как оформлено чужое приложение? Как вы передаете ему QString, вызывая функцию/метод? Как это приложение сообщает о завершении расчетов?
[/quote]

С чужим приложением общение идет через его api.
Есть мой класс (назовем его X).
В этом же классе X инициализирую qApp и создаю mainWindow класс.

В классе X есть функция которая делает вызовы api и в конце возвращает результат в переменную класса X, которая
signal'ом передается в mainWindow. mainWindow с классом X - общаются по signal,slot.

когда выношу qApp в отдельный поток. signal,slot - молчат в обе стороны.

Как пытался сделать:

Код:
class Xclass : public QObject
{
   Q_OBJECT

public:
 
  explicit Xclass();

  Yclass *y = new Yclass();

  ..
  ..

}


Xclass::XClass(){

  ..

  connect (y,SIGNAL(sig()),this,SLOT(slt()));

  boost::thread thrd( boost::bind(&Yclass::init, y, parentWnd);

}

////////////////////////////////////////

class YClass : public QObject
{
..
}

void YClass::init(parentWnd){

int d = 0;

QApplication app = new QApplication(d, NULL);

MainWindow *myWin = new MainWindow(0,this);

HWND myWnd = (HWND)myWin->winId();
SetParent(myWnd, parentWnd);

myWin->show();

app->exec();

}


Название: Re: Запуск Qt GUI из не основного потока
Отправлено: qate от Февраль 14, 2017, 19:48
С чужим приложением общение идет через его api.

api это значит вызовы через его библиотеку ?
или что понимается под api тут ?


Название: Re: Запуск Qt GUI из не основного потока
Отправлено: QuJu от Февраль 15, 2017, 02:55

api это значит вызовы через его библиотеку ?
[/quote]
да


Название: Re: Запуск Qt GUI из не основного потока
Отправлено: Old от Февраль 15, 2017, 06:26
Только теперь становится не совсем понятно для чего все это? Для чего создавать GUI в отдельном потоке?

Судя по написаному вами, достаточно написать обычное Qt-приложение, в котором по нажатии кнопки вызывать нужный метод класса X в отдельном потоке, через тот же QtConcurrent.