Одним из распространённых способов создания отдельных параллельных потоков в приложении на Qt и выполнения полезных действий в них является наследование от класса QThread и переопределение метода run() , в котором и будет выполняться полезный код приложения. При знакомстве с потоками довелось прочитать различные мнения на эту тему, и в данном уроке познакомимся с одним из возможных способов работы с потоками, но который считается не самым лучшим вариантом.
Вообще, если Мы производим наследование от класса QThread , то логично будет предположить, что это делается с той целью, что нам недостаточно функционала данного класса. Но когда это делается лишь с той целью, чтобы вынести в метод run() некий полезный код, который должен выполняться в отдельном потоке, то тут явно что-то не так. К тому де может возникнуть проблема с масштабированием приложения и повторным использованием кода, особенно сильно это может проявится в том случае, когда подобных наследованных классов становится достаточно много.
Данный метод является самым низкоуровневым и используется в первую очередь для кастомизации нативных потоков. Что несколько противоречит обычной необходимости выполнения задачи в отдельном потоке. То есть, как было сказано выше, подобный подход в первую очередь необходим для того, чтобы расширить функционал класса. Но тем не менее, данный метод необходимо рассмотреть, к чему и приступим.
main.cpp
Данный пример крайне небольшой, поэтому не будем подробно вдаваться в структуру проекта. Отметим, что будет создано консольное приложение, в файле main.cpp которого будет создано три потока с различными именами. А классы потоков будут наследованы от QThread.
- #include <QCoreApplication>
- #include "examplethreads.h"
- int main(int argc, char *argv[])
- {
- QCoreApplication a(argc, argv);
- ExampleThreads threadA("thread A");
- ExampleThreads threadB("thread B");
- ExampleThreads threadC("thread C");
- threadA.start(); // Запускаем потоки
- threadB.start(); // и наблюдаем их параллельную работу
- threadC.start(); // в выводе qDebug
- return a.exec();
- }
examplethreads.h
- #ifndef EXAMPLETHREADS_H
- #define EXAMPLETHREADS_H
- #include <QThread>
- class ExampleThreads : public QThread
- {
- public:
- explicit ExampleThreads(QString threadName);
- // Переопределяем метод run(), в котором будет
- // располагаться выполняемый код
- void run();
- private:
- QString name; // Имя потока
- };
- #endif // EXAMPLETHREADS_H
examplethreads.cpp
- #include "examplethreads.h"
- #include <QDebug>
- ExampleThreads::ExampleThreads(QString threadName) :
- name(threadName)
- {
- }
- void ExampleThreads::run()
- {
- for (int i = 0; i <= 100; i++ ) {
- qDebug() << name << " " << i;
- }
- }