QProcess – процеси Qt, Програмування Qt
Зміст
- Процеси та потоки в Qt
- QProcess – процеси в Qt
- QThread - потоки в Qt
- Пріоритети потоків у Qt
- Обмін повідомленнями між потоками
- Сигнально-слотові з'єднання
- Зв'язок між потоками за допомогою надсилання подій
- Синхронізація
- QMutex - м'ютекси в Qt
- QWaitCondition — умовні очікування Qt
- Взаємне блокування
- QSemaphore - семафори в Qt
У тому випадку, коли користувач або програма виконують запуск іншої програми, операційна система завжди створює новий процес. Процес – це екземпляр програми, завантаженої на згадку про комп'ютер для виконання.
За своєю суттю, процеси — це незалежні один від одного програми, які мають свої власні дані. Коротко процес можна охарактеризувати як спільність коду, даних, і ресурсів, необхідні його роботи. p align="justify"> Під ресурсами маються на увазі об'єкти, що запитуються і використовуються процесами в період їх роботи. Будь-яка прикладна програма, запущена на вашому комп'ютері, є нічим іншим, як процесом.
Створення процесу може виявитися корисним для використання функціональних можливостей програм, які не мають графічного інтерфейсу та працюють із командним рядком. Інша корисна властивість – досить простий запуск інших програм із поточної програми. Особливо він корисний для запуску команд чи програм, дії яких нетривалі за часом.
Процеси можна створювати за допомогою класуQProcess, який визначений у заголовному файліQProcess. Завдяки тому, що цей клас успадкований від класу QIODevice, об'єкти цього класу можуть зчитувати інформацію, що виводиться запущеними процесами, і навіть підтверджувати їхзапити щодо введення інформації. Цей клас містить методи для маніпулювання системними змінними процесами. Робота з об'єктами класуQProcessпроводиться в асинхронному режимі, що дозволяє зберігати працездатність графічного інтерфейсу програми в моменти, коли процеси, що запущені, знаходяться в роботі. При появі даних чи інших подій об'єкти класуQProcessнадсилають сигнали. Наприклад, при виникненні помилок об'єкт процесу надішле сигналerror()з кодом цієї помилки.
Для створення процесу його потрібно запустити. Запуск процесу виконується методомstart(), в який необхідно передати ім'я команди та список її аргументів, або всі разом - команду та аргументи одним рядком. Як тільки процес буде запущений, надсилається сигналstarted(), а після завершення його роботи надсилається сигналfinished(). Разом із сигналомfinished()надсилається код і статус завершення роботи процесу. Для отримання статусу виходу можна викликати методexitStatis(), який повертає лише два значення:NormaiExit(нормальне завершення) таCrashExit(аварійне завершення).
Для читання даних запущеного процесу класQProcessнадає два розділені канали: канал стандартного виведення (stdout) і канал помилок (stderr). Ці канали можна перемикати за допомогою методуsetReadChannel(). Якщо процес готовий надати дані поточним встановленим каналом, то надсилається сигналreadyRead(). Також надсилаються сигнали для кожного каналу окремо:readyReadStandardOutput()іreadyReadStandardError().
Зчитувати та записувати дані в процес можна за допомогою методів класу QIODevice::write() ,read(),readLine()таgetChar(). Також для читання можна скористатися методами, прив'язаними до конкретних каналів:readAllStandardOutput()таreadAllStandardError(). Ці методи зчитують дані об'єкти класуQByteArray.
Додаток, зображений малюнку, ілюструє застосування деяких методів класуQProcess. У текстовому поліCommand(Команда) може бути введена будь-яка команда, що відповідає операційній системі. Якщо запущена команда або програма здійснюють виведення на консоль, відображення буде проводитися у віджеті багаторядкового тестового поля.
У конструкторі класуShellвиробляється створення об'єкта класуQProgress. Його сигналreadyReadStandardOutput()з'єднується зі слотомslotDataOnStdout(), в якому викликається методreadAllstandardOutput()для зчитування всього вмісту стандартного потоку. Після зчитування ці дані додаються, викликом методуappend(), у віджет багаторядкового текстового поляm_ptxtDisplay.
СлотslotReturnPressed()з'єднаний з сигналом кнопкиclicked()(покажчикpcmd) і з сигналом однорядкового текстового поляreturnPressed()(покажчик m_txtCommand). Деякі команди Windows, наприкладdir, не є окремими програмами, тому вони повинні бути виконані за допомогою командного інтерпретатора cmd. Тому для Windows в командний рядок спочатку додається рядок "cmd /С". У решті, введений в однорядковому текстовому полі рядок передається як є, без доповнень. Для запуску процесу викликається метод start() .