Подтвердить что ты не робот

Как заставить Qt работать, когда основной поток занят?

Main (функция main is there), поток моей программы зарезервирован для задач без GUI. Он называет ряд длинных вычислительных функций. Все реализованные графические интерфейсы выполняют свою работу в отдельных потоках.

Теперь я собираюсь реализовать еще один GUI с помощью Qt. Документация Qt говорит, что все задачи, связанные с GUI, должны выполняться в основном потоке. В моем случае вставка случайных вызовов QCoreApplication:: processEvents() в основном потоке была бы практически бесполезной из-за больших задержек между ними.

Есть ли способ преодолеть это ограничение Qt? Невозможно ли сделать что-то не GUI, связанное в основном потоке программы Qt?

4b9b3361

Ответ 1

Нет, вы должны делать свои вычисления в отдельном потоке. Как вы уже упоминали, в QCoreApplication::processEvents() есть работа, но похоже, что вы не можете сделать эту работу для вас.

Если вы не хотите выполнять всю работу по настройке QThread и перемещать весь свой код, вы можете обнаружить, что QtConcurrent:: функция запуска полезна - она ​​позволяет выполнять функцию асинхронно.

Несколько указателей: вы должны попытаться сохранить поток основного (GUI) как можно более легким. Большие суммы ввода-вывода или вычисления должны либо выполняться асинхронно с использованием QtConcurrent:: run, либо запускаться внутри отдельного QThread. В зависимости от сложности вашего кода вы можете уйти с помощью метода QtConcurrent.

Ответ 2

Лучше всего выгрузить длинные вычисления на другие потоки, поэтому основной поток графического интерфейса пользователя будет реагировать. Старинная школа, способная делать вещи, заключалась в том, чтобы убедиться, что ваши вычисления никогда не запускаются слишком долго без опроса обработчика событий GUI, но это не масштабируется для многоядерных процессоров.

К счастью, Qt имеет отличную поддержку потоков. Раньше вам приходилось запускать собственную систему, например, для обработки задач в пуле потоков с помощью QThread, QMutex, QWaitCondition и т.д., Но последние выпуски Qt упростили работу с абстракциями более высокого уровня например QThreadPool, QtConcurrent::run и QFuture.

Ответ 3

Я не знаю, как все будет происходить, если вы вызовете QApplication:: exec() из другого потока, который затем станет вашим потоком gui. Просто идея.

(Сообщите нам, если это сработает, было бы интересно...)