Evgenii Legotckoi
9 мая 2016 г. 23:12

Qt/C++ - Урок 047. QThread - создание потоков в Qt

Одним из распространённых способов создания отдельных параллельных потоков в приложении на Qt и выполнения полезных действий в них является наследование от класса QThread и переопределение метода run() , в котором и будет выполняться полезный код приложения. При знакомстве с потоками довелось прочитать различные мнения на эту тему, и в данном уроке познакомимся с одним из возможных способов работы с потоками, но который считается не самым лучшим вариантом.

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

Данный метод является самым низкоуровневым и используется в первую очередь для кастомизации нативных потоков. Что несколько противоречит обычной необходимости выполнения задачи в отдельном потоке. То есть, как было сказано выше, подобный подход в первую очередь необходим для того, чтобы расширить функционал класса. Но тем не менее, данный метод необходимо рассмотреть, к чему и приступим.


main.cpp

Данный пример крайне небольшой, поэтому не будем подробно вдаваться в структуру проекта. Отметим, что будет создано консольное приложение, в файле main.cpp которого будет создано три потока с различными именами. А классы потоков будут наследованы от QThread.

  1. #include <QCoreApplication>
  2. #include "examplethreads.h"
  3.  
  4. int main(int argc, char *argv[])
  5. {
  6. QCoreApplication a(argc, argv);
  7.  
  8. ExampleThreads threadA("thread A");
  9. ExampleThreads threadB("thread B");
  10. ExampleThreads threadC("thread C");
  11.  
  12. threadA.start(); // Запускаем потоки
  13. threadB.start(); // и наблюдаем их параллельную работу
  14. threadC.start(); // в выводе qDebug
  15.  
  16. return a.exec();
  17. }

examplethreads.h

  1. #ifndef EXAMPLETHREADS_H
  2. #define EXAMPLETHREADS_H
  3.  
  4. #include <QThread>
  5.  
  6. class ExampleThreads : public QThread
  7. {
  8. public:
  9. explicit ExampleThreads(QString threadName);
  10.  
  11. // Переопределяем метод run(), в котором будет
  12. // располагаться выполняемый код
  13. void run();
  14. private:
  15. QString name; // Имя потока
  16. };
  17.  
  18. #endif // EXAMPLETHREADS_H

examplethreads.cpp

  1. #include "examplethreads.h"
  2. #include <QDebug>
  3.  
  4. ExampleThreads::ExampleThreads(QString threadName) :
  5. name(threadName)
  6. {
  7.  
  8. }
  9.  
  10. void ExampleThreads::run()
  11. {
  12. for (int i = 0; i <= 100; i++ ) {
  13. qDebug() << name << " " << i;
  14. }
  15. }

Вывод потоков

Видеоурок

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь