Название: Запуск 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. Как оформлено чужое приложение? Как вы передаете ему QString, вызывая функцию/метод? Как это приложение сообщает о завершении расчетов?Я пытался связать через QObject connect signal slot, делая наследниками от QObject класс который запускает сторонний поток и класс с qApp Название: 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 Название: 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. |