Одним із поширених способів створення окремих паралельних потоків у додатку на 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; } }