Evgenii Legotckoi
09 травня 2016 р. 23:12

Qt/C++ - Урок 047. QThread – Як створити потоки в Qt

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

Виведення потоків

Відеоурок

Вам це подобається? Поділіться в соціальних мережах!

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up