Реклама

Поиск

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

TutorialQtQt, QThread, потоки417

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

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

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

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

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

TutorialQtQt, QThread, потоки508

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

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

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

Реклама

Архитектура сетей передачи данных

TutorialТехнологии передачи данныхnetwork, transmission348

Декомпозиция задачи сетевого взаимодействия

Архитектура сети - это представление сети в форме системы взаимосвязанных элементов, на каждый из которых возложена определенная частная функция.

При этом каждый из элементов сети решает одну общую задачу. Вся общая задача разбивается на ряд мелких задач, которые решают различные элементы сети, то есть одна единая задача подвергается декомпозиции. Взаимодействие между всеми элементами сети осуществляется через формализованный набор правил, именуемый протоколом.

Декомпозиция задачи

Декомпозиция - разбиение одной сложной задачи на несколько простых.

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

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

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

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

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

User Guide #01 - Что такое Ruby?

TutorialRubyRuby, ruby lesson, ruby уроки, user guide, руководство пользователя130

Ruby является "интерпретируемым языком сценариев для быстрого и простого объектно-ориентированного программирования". Что это означает?

интерпретируемый язык программирования:

  • возможность создания вызовов непосредственно в операционную систему
  • мощные операции со строками и регулярными выражениями
  • непосредственная обратная связь во время разработки

Реклама

Реклама

Реклама