QThread
не просто поток, но и менеджер потоков. Если вы хотите, чтобы ваш поток играл Qt, то QThread
- это путь. Qt управляется событиями, как и большинство современных программ. Это немного сложнее и гибче, чем «заставить поток запускать функцию».
В Qt вы обычно создаете рабочего вместе с QThread
, переместите работника в этот поток, затем каждая функция, вызванная системой событий для этого рабочего объекта, будет выполнена в потоке, с которым рабочий объект имеет сродство к ,
Таким образом, вы можете инкапсулировать функциональность в другом объекте рабочего, скажем, SafetyChecker
Printer
, ServoDriver
, JetDriver
и так далее, создать экземпляр каждого, переместить его в выделенную нить и вы установлены. Вы по-прежнему можете вызывать функции, которые будут «блокировать», а не использовать мелкозернистые события, и использовать атомику или мьютексы для межинтерфейсной синхронизации. В этом нет ничего плохого, если вы не блокируете поток main/gui.
Возможно, вы не захотите выполнять управляемый код вашего кода, так как в многопоточном сценарии, который будет включать в себя очереди в виде очередей, которые незначительно медленнее прямых или даже виртуальной отправки. Настолько, что если вы сделаете многопоточность слишком тонкой, вы, вероятно, на самом деле испытаете огромный успех.
Это говорит о том, что использование не-gui-материалов Qt имеет свои достоинства, что позволит вам сделать более чистую и гибкую конструкцию намного проще, и вы все равно получите преимущества многопоточности, если будете правильно реализовывать вещи. Вы все еще можете использовать подход, управляемый событиями, чтобы управлять всем этим, это будет значительно проще, чем использование только std::thread
, что является гораздо более низким уровнем конструкции. Вы можете использовать управляемый событиями подход к настройке, настройке, мониторингу и управлению дизайном, в то время как критические части могут выполняться в блокирующих функциях во вспомогательных потоках для достижения мелкозернистого управления с наименьшими возможными издержками синхронизации.
Чтобы уточнить - ответ не фокусируется на выполнении задачи асинхронной работы, поскольку два других ответа уже выполняются, и поскольку, как я упоминал в комментариях, задачи асинхронного программирования не предназначены для приложений управления. Они подходят для выполнения небольших задач, которые по-прежнему занимают больше времени, чем вы хотели бы заблокировать основной поток. Как рекомендуемое руководство, все, что занимает более 25 мс, предпочтительнее выполнять async. В то время как печать - это что-то, что может занять минуты или даже часы, и подразумевает непрерывное управление функциями управления параллельно и с использованием синхронизации. Задачи Async не дают вам гарантии производительности, времени ожидания и заказа для приложений управления.
Хорошая вещь о 'станд :: thread' это уменьшает зависимость, если вы уже используете Qt , – NathanOliver
Я бы не хотел привязывать свой * код печати * к определенной «Библиотеке GUI», если бы меня не заставили. Я не вижу недостатков в использовании 'std :: thread' в максимально возможной степени. – Galik
В моей работе мы разрабатываем наш графический интерфейс с Qt, поэтому он уверен, что он будет привязан к Qt: GUI находится в Qt, а код программы принтера также использует Qt. – ElevenJune