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

РуководствоQtQt, QThread, потоки1267

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

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

Видеоурок

Реклама

Комментарии

Комментарии

Только авторизованные пользователи могут оставлять комментарии.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
Последние комментарии
  • EVILEG
  • 24 апреля 2017 г. 20:44

Подключение вашего Qt приложения к сервисам Google, используя OAuth 2.0

У меня пока мыслей на этот счёт нет ((

Подключение вашего Qt приложения к сервисам Google, используя OAuth 2.0

Пробовал играться с шарком, либо я криво смотрел, либо почему-то POST запросы на oauth.yandex.ru не летят, хотя должны постом лететь, я и исходники QOAuth2AuthorizationCodeFlow ковырял на пред...

  • EVILEG
  • 24 апреля 2017 г. 13:39

Подключение вашего Qt приложения к сервисам Google, используя OAuth 2.0

Возможно, стоит Wireshark`ом запросы посмотреть. В чём отличие идёт аякс запроса от запроса из библиотеки. Возможно, что не хватает какой-нибудь заголовочной информации.

Сейчас обсуждают на форуме
  • Arrow
  • 1 мая 2017 г. 1:00

Callback функции

Первый раз пытаюсь работать с Callback функциями. Помогите понять, что и где я не так делаю. Вот код: ReverseString.h #ifndef REVERSESTRING_H#define REVERSESTRING_H#includ...

  • EVILEG
  • 30 апреля 2017 г. 10:22

QMenu

Вам не кажется, что вы увлеклись со скриншотами? Добавляйте голый программный код в сообщения через специальный диалог. Это кнопка с двумя фигурными скобками. Иногда требуется повторить код у ...

  • CJIaBiK
  • 29 апреля 2017 г. 21:07

QPushButton

Спасибо

  • CJIaBiK
  • 29 апреля 2017 г. 17:57

QWebEngineView

спасибо помогло

  • EVILEG
  • 29 апреля 2017 г. 17:47

Ошибка

Такое случается, когда добавляете новые файлы, а объектный файл, в данном случае mainwindow.obj, не пересобирается как положено. Приходится чистить сборку.