Реклама

Поиск

Qt/C++ - Урок 046. QThread - Введение

TutorialQtQt, QThread, потоки418

GUI поток и рабочий поток

Каждая программа имеет один поток (thread) при запуске. Данный поток называется основным потоком или GUI потоком в Qt приложениях. Qt GUI должен запускаться в данном потоке. Все виджеты и несколько похожих классов, например QPixmap, не работают во вторичных потоках. Вторичным потоком обычно называют рабочий поток, который призван разгрузить основой поток программы.

Одновременный доступ к данным

Если два потока имеют указатель на некоторый объект, то возможен доступ обоих потоков к данному объекту в некоторый момент времени и это может разрушить целостность объекта. Необходимо предотвращать одновременный доступ к объекту из разных потоков.

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

TutorialQtQt, QThread, потоки508

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

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

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

Реклама

Qt/C++ - Урок 048. QThread - работа с потоками с помощью moveToThread

TutorialQtmoveToThread, QObject, Qt, QThread, потоки756

В предыдущей статье мы только коснулись работы с потоками , причём в том варианте, который служит больше для кастомизации самого потока, хотя и может быть использован для совершения посторонней работы, никак не связанной непосредственно с потоками. То есть вариант с наследованием от QThread и переопределение метода run() .

Теперь же мы создадим класс ExampleObject, объекты которого будут передаваться в отдельные потоки с помощью метода moveToThread() и выполняться в этих самых потоках. А полезную работу будет совершать слот-метод run(), который будет определён в данном классе. Что важно, класс объектов будет наследован от QObject .

Для того, чтобы работа в методе run() могла выполняться циклично, используем цикл while , управлять которым будем с помощью переменной bool m_running. Для удобства работы с этой переменной определяем её в качестве Q_PROPERTY. Ну а по завершении работы будем испускать сигнал finished() .

Реклама

Реклама

Реклама