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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Запуск Qt GUI из не основного потока  (Прочитано 7682 раз)
QuJu
Гость
« : Февраль 13, 2017, 01:08 »

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

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Февраль 13, 2017, 03:16 »

1. доускается.
2. boost::thread, std::thread,QThread это все обертки над системными нитками поэтому совершенно не важно кем создаются эти нитки.
3. а вот это зависит от самого общения (какие данные и когда должны передаваться между нитками).
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #2 : Февраль 13, 2017, 08:36 »

по неясной постановке задачи можно предложить воспользоваться qprocess и обмен вести через stdin stdout

Записан
QuJu
Гость
« Ответ #3 : Февраль 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
« Последнее редактирование: Февраль 13, 2017, 09:27 от QuJu » Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Февраль 13, 2017, 10:08 »

2. Я так понял,что используя QThread я не смогу запустить QApp в другом потоке
Возможно да, но даже такое ограничение, что для создания объекта QThread возможно нужен инстант QApplication, не делает QThread не врапером системных ниток. Улыбающийся

3. Данные - QString и int. QString после нажатия кнопки в Qt  передается в чужую программу - она делает расчет и возвращает Qt результат Int.
Я пытался связать через QObject connect signal slot, делая наследниками от QObject класс который запускает сторонний поток и класс с qApp
Как оформлено чужое приложение? Как вы передаете ему QString, вызывая функцию/метод? Как это приложение сообщает о завершении расчетов?
Записан
QuJu
Гость
« Ответ #5 : Февраль 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();

}
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #6 : Февраль 14, 2017, 19:48 »

С чужим приложением общение идет через его api.

api это значит вызовы через его библиотеку ?
или что понимается под api тут ?
Записан
QuJu
Гость
« Ответ #7 : Февраль 15, 2017, 02:55 »


api это значит вызовы через его библиотеку ?
[/quote]
да
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Февраль 15, 2017, 06:26 »

Только теперь становится не совсем понятно для чего все это? Для чего создавать GUI в отдельном потоке?

Судя по написаному вами, достаточно написать обычное Qt-приложение, в котором по нажатии кнопки вызывать нужный метод класса X в отдельном потоке, через тот же QtConcurrent.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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