3.45M
Category: softwaresoftware

Процессы и потоки. Программирование поддержки сети

1.

ВНИМАНИЕ!
ИСПОЛЬЗОВАНИЕ СРЕДСТВ СВЯЗИ, ФОТО,
ВИДЕО И ЗВУКОЗАПИСИ ЗАПРЕЩЕНО!

2.

ИНФОРМИРОВАНИЕ О ХОДЕ СПЕЦИАЛЬНОЙ ВОЕННОЙ ОПЕРАЦИИ
2

3.

ВОЕННО-КОСМИЧЕСКАЯ АКАДЕМИЯ ИМЕНИ А.Ф. МОЖАЙСКОГО
Кафедра системы сбора и обработки информации
«Методы программирования»
Лекция № 19
кандидат технических наук
полковник Дудкин А.С.

4.

4
Лекция № 19. Процессы и потоки.
Программирование поддержки сети
Цель: изучение технологий применения кроссплатформенной библиотеки для
построения переносимых приложений с использованием классов для работы с
процессами, потоками и поддержкой сети.
Учебные вопросы:
1. Процессы. Потоки.
2. Сокетное соединение.
3. Модель «клиент-сервер».

5.

Литература по теме занятия
1. Платонов А.А., Домбровский А.Ф. Методы программирования: курс лекций.
Электронное пособие. – СПб.: ВКА имени А.Ф. Можайского, 2016. – 171 с.
2. Технологии программирования: учебное пособие / В.В. Мышко, Д.Н.
Бородько, В.В. Ткаченко. – СПб.: ВКА имени А.Ф. Можайского, 2015. – 84 с.
3. Шлее М. Qt 5.10. Профессиональное программирование на C++. – СПб.: БХВПетербург, 2019. – 912 с.
4. Программирование на языке С++ в среде Qt Creator: / Е.Р. Алексеев, Г. Г.
Злобин, Д. А.Костюк,О.В.Чеснокова, А.С.Чмыхало М. : ALT Linux, 2015. 448 с. :
ил. (Библиотека ALTLinux).
5. Технологии разработки программного обеспечения: практикум / В.А.
Мыльников, В.А. Лохвицкий, А.С. Марковский. – СПб.: ВКА имени А.Ф.
Можайского, 2016. – 150 с.
6. ГОСТ Р 56939-16. Разработка безопасного программного обеспечения.
7. РУСБ.10015-01 – Руководящие указания по конструированию прикладного
программного обеспечения для ОС СП «Astra Linux Special Edition».
8. Qt Reference Documentation.
5

6.

Контроль готовности обучающихся к учебному занятию
Контрольный вопрос № 1: Сформулируйте содержание методологии
объектно-ориентированного программирования
методология программирования, основанная на представлении
программы в виде совокупности объектов, каждый из которых
является экземпляром определенного класса, а классы
сформированы в иерархии наследования
6

7.

Контроль готовности обучающихся к учебному занятию
Контрольный вопрос № 2: Назовите фундаментальные принципы
объектно-ориентированного программирования
ИНКАПСУЛЯЦИЯ – принцип, согласно которому внутренне
устройство сущностей нужно объединять в специальной
«оболочке» и скрывать от вмешательства извне.
НАСЛЕДОВАНИЕ – принцип, согласно которому абстрактный
тип данных может наследовать данные и функциональность
некоторого существующего типа, способствую повторному
использованию компонентов программного обеспечения.
ПОЛИМОРФИЗМ – способность объекта использовать
методы производного класса, который не существует на
момент создания базового.
7

8.

Учебный вопрос № 1
Процессы. Потоки.
8

9.

Учебный вопрос № 1
9
Основными критическими ресурсами при выполнении приложения
являются время и память:
•процесс описывает статику приложения и является контейнером
для всех ресурсов, используемых приложением (выделяемую для
приложения память, открытые файлы и другие ресурсы
приложения);
•для описания динамики выполнения приложения используется
объект «поток».

10.

Учебный вопрос № 1
10

11.

Учебный вопрос № 1
11
Выбор способа реализации многозадачности
Обычно реализация многопоточного процесса является более эффективным решением
по сравнению с реализацией посредством процессов, так как:
•на создание потоков система тратит времени и ресурсов гораздо меньше, чем на
создание процессов;
•переключение потоков требует относительно небольших затрат (сохранение и
восстановление контекста потока);
•все потоки одного процесса разделяют одно адресное пространство и имеют доступ к
глобальным данным, поэтому не нужно задействовать системные механизмы для
обмена данными;
•все потоки одного процесса имеют доступ к ресурсам, принадлежащим этому процессу,
таким как открытые файлы, каналы и т. д.;
•потоки, принадлежащие разным процессам, не имеют между собой ничего общего,
однако они могут получить доступ к одним и тем же ресурсам и общей памяти.

12.

Учебный вопрос № 1
12
Реализация многозадачности посредством процессов
•При создании распределенных (клиент-серверных) приложений;
•Локально.
Программист должен знать и эффективно применять механизмы для
обмена данными между процессами.

13.

Учебный вопрос № 1
QProcess
• Наследует IODevice =>
– объекты могут считывать/записывать данные
запущенного процесса.
• Посредством сигналов/слотов реакция на запросы вывода данных запущенным
процессом.
• Средства для манипулирования системными переменными.
При запуске процесса ОС:
•находит нужный исполняемый файл;
•создает служебные системные структуры для описания процесса;
•формирует для нового процесса адресное пространство и загружает в него код и
данные исполняемого файла, а также требуемые динамические библиотеки
13

14.

Учебный вопрос № 1
14
Для создания процесса его нужно запустить. Запуск процесса выполняется методом
start (), в который необходимо передать имя команды и список ее аргументов, либо
все вместе: команду и аргументы одной строкой.
Как только процесс будет запущен, отправляется сигнал started(), а после
завершения его работы — сигнал finished() -> NormalExit (нормальное завершение) и
CrashExit (аварийное завершение).
Для чтения данных запущенного процесса класс QProcess предоставляет два
разделенных канала:
канал стандартного вывода (stdout) и канал ошибок (stderr).
Считывать и записывать данные в процесс можно с помощью методов класса
QiODevice: write () , read (), readLine () и getchar () .

15.

Учебный вопрос № 1
Сигналы
старта/завершения
дочернего процесса
void finished ( int
exitCode, QProcess::ExitStatus
exitStatus )
QProcess::NormalExit
QProcess::CrashExit
void started ()
15

16.

Учебный вопрос № 1
16
Реализация многозадачности посредством потоков
•разделение задачи на несколько подзадач, последовательность
выполнения которых несущественна (от программиста требуется корректно
представить задачу в виде подзадач и, возможно, назначить отдельным
потокам разные приоритеты);
•разделение задачи на несколько подзадач, когда «выход» одной
подзадачи является «входом» для другой, например, для того, чтобы
данные можно было обрабатывать, их сначала нужно сформировать (все
или хотя бы часть). Для таких задач на первый план выходит синхронизация
потоков;
•разделение задачи на несколько подзадач, когда выполнение одной
подзадачи, например ввод данных с внешнего устройства, является
приоритетной по отношению к другим действиям, например обработке
данных.

17.

Учебный вопрос № 1
17
Поток
Независимая задача, которая выполняется внутри процесса и разделяет вместе с
другими потоками данного процесса:
•общее адресное пространство,
•код
•глобальные данные
•ресурсы
Важно!
все потоки одного процесса выполняются в едином адресном пространстве, поэтому,
+ имеют доступ ко всем ресурсам процесса
- «-» => синхронизация

18.

Учебный вопрос № 1
18
СОЗДАНИЕ ПОТОКА средствами Qt
•создать класс, производный от Qthread
•перегрузить виртуальный метод void QThread::run () [virtual protected]
•создать объект производного типа
•вызвать посредством созданного объекта метод
void QThread::start ( Priority priority = InheritPriority ) [slot],
который в свою очередь создаст собственно поток, который
начнет выполнение с перегруженного метода run()

19.

Учебный вопрос № 1
19
Приоритеты
У каждого потока есть приоритет, указывающий процессору, как должно протекать
выполнение потока по отношению к другим. Приоритеты разделяются по группам:
♦ в первую группу входят четыре приоритета, применяемые наиболее часто. Их
значимость распределяется по возрастанию: IdlePriority, LowestPriority, LowPriority,
NormalPriority. Они подходят для решения задач, которым процессор требуется только
время от времени, — например, для фоновой печати или для каких-нибудь несрочных
действий;
♦ во вторую группу входят два приоритета: HighPriority и HighestPriority. Пользуйтесь
этими приоритетами с особой осторожностью. Обычно такие потоки большую часть
времени ожидают каких-либо событий;
♦ в третью входит лишь один приоритет - TimeCriticalPriority. Потоки с ним нужно
создавать в случае крайней необходимости. Этот приоритет нужен для программ,
напрямую общающихся с аппаратурой или выполняющих операции, которые ни в коем
случае не должны прерваться.

20.

Учебный вопрос № 1
20
Завершение потока
•если в потоке есть цикл обработки событий, то при выходе из цикла. Для такого
выхода должен быть вызван метод void QThread::quit () [slot]
•void QThread::terminate () [slot] – аварийное завершение
•если цикла обработки событий нет, то при естественном завершении метода
run()
Приостановка потока
bool QThread::wait(unsigned long time = ULONG_MAX)
void QThread::msleep(unsigned long msecs) [static]
void QThread::sleep(unsigned long secs) [static]
void QThread::usleep(unsigned long usecs) [static]

21.

Учебный вопрос № 1
Сигналы потока
•void QThread::finished() [signal]
•void QThread::started() [signal]
21

22.

Учебный вопрос № 1
22
Синхронизация потоков одного процесса
• QMutex
• QSemaphore
• QReadWriteLock – похож на QMutex, но предоставляет
возможность различать операции чтения/записи
• QWaitCondition – «усыпить потоки» до наступления какогонибудь условия

23.

Учебный вопрос № 2
Сокетное соединение.
23

24.

Учебный вопрос № 2
24
Сокет (от англ, socket — гнездо, разъем) — это устройство
пересылки данных с одного конца линии связи на другой. Другой
конец линии может принадлежать процессу, работающему на
локальном компьютере, а может располагаться и на удаленном
компьютере, подключенном к Интернету и расположенном в другом
полушарии Земли.
Сокетное соединение – это соединение типа точка-точка (point to
point), которое осуществляется между двумя процессами.

25.

Учебный вопрос № 2
25
Сокеты разделяют на:
- дейтаграммные (datagram);
- поточные (stream).
Дейтаграммные сокеты осуществляют обмен пакетами данных.
Поточные сокеты устанавливают связь и выполняют потоковый обмен
данными через установленную ими линию связи.
Поточные сокеты работают в обоих направлениях — другими словами, то,
что один из процессов записывает в поток, может быть считано процессом
на другом конце связи, и наоборот.
Для дейтаграммных сокетов Qt предоставляет класс QUdpSocket, а для
поточных — класс QTcpSocket.

26.

Учебный вопрос № 2
26
Класс QTcpSocket содержит набор методов для работы с TCP (Transmition
Control Protocol, протокол управления передачей данных) — сетевым
протоколом низкого уровня, который является одним из основных
протоколов в Интернете. Это самый лучший способ для установления связи
между двумя компьютерами и передачи данных между ними с высокой
степенью надежности.
Класс QUdpSocket содержит набор методов для работы с UDP (User Datagram
Protocol, протокол пользовательских дейтаграмм). Этот сокет реализует
ненадежную передачу данных. Он не гарантирует доставки пакета, что
является одновременно и недостатком, и преимуществом, так как позволяет
быстрее и эффективнее доставлять данные для приложений, которым
необходима большая пропускная способность линий связи либо нужно
малое время доставки данных.

27.

Учебный вопрос № 3
Модель «клиент-сервер».
27

28.

Учебный вопрос № 3
Сценарий модели «клиент-сервер» выглядит очень просто: сервер предлагает
услуги, а клиент ими пользуется.
28

29.

Учебный вопрос № 3
29

30.

Учебный вопрос № 3
30
В библиотеке Qt есть модуль работы с сетью – Qt Network:
QT += network;
Модуль предоставляет ряд полезных классов, среди которых - QHttp,
QTcpSocket и QTcpServer.
Основная задача QTcpServer – отслеживать подключение клиентов. Сервер
слушает определенный порт, задаваемый при вызове метода listen. При
подключении клиента, вырабатывается сигнал newConnection и создается
сокет (QTcpSocket) для обмена данными с клиентом. Получить указатель на
сокет можно вызовом nextPendingConnection.

31.

Учебный вопрос № 3
Реализация ТСР-сервера, Реализация ТСР-клиента
31

32.

Учебный вопрос № 3
Реализация UDP-сервера и UDP-клиента
32

33.

Учебный вопрос № 3
33
Управление доступом к сети
Для того чтобы использовать классы высокого уровня, такие как QHttp и QFtp,
необходимо понимание концепций, которые за ними стоят.
Механизм управления доступом к сети обладает поддержкой куки (cookie), прокси
(proxy), кеширования данных, аутентификации и одновременной пересылкой запросов.
Три основных класса:
QNetworkAccessManager;
QNetworkRequest;
QNetworkReply.
Класс QNetworkAccessManager поддерживает такие операции, как:
♦ head — получение статуса;
♦ get — загрузка данных;
♦ put — пересылка данных;
♦ post — это гибрид get и put, предназначен только для HTTP.

34.

Учебный вопрос № 3
Пример файлового загрузчика
34

35.

Учебный вопрос № 3
35
Класс QNetworkRequest содержит один подлежащий отправке запрос,
основной его компонент - URL. Этот класс содержит метаданные для запроса
— такие как, например, НТТР-заголовок и другие опции.
Класс QNetworkReply содержит данные ответа, метаданные URL, HTTPзаголовок и статус шифрования, условные ошибки и т. д.
Объекты этого класса отправляют сигналы:
♦ readyRead ( ) — при поступлении данных;
♦ finished ( ) — при завершении;
♦ error ( ) — если возникли проблемы;
♦ downloadProgress() и uploadProgress() — сигналы процесса загрузки.

36.

Учебный вопрос № 3
36
Блокирующий подход
Вы можете ждать до полного завершения операции и блокировать текущий поток
посредством вызова одного из методов, начинающегося с waitFor...
Большинство этих методов определено в классе QAbstractSocket и предназначено для
того, чтобы:
♦ waitForConnected ( ) — дождаться соединения;
♦ waitForReadyRead ( ) — дождаться поступления данных;
♦ waitForBytesWritten ( ) — дождаться, когда данные будут записаны;
♦ waitForDisconnected() — дождаться отсоединения;
♦ waitForEncrypted() — дождаться шифрования данных (только для QSslSocket).

37.

Учебный вопрос № 3
37
Режим прокси
В программах, работающих с сетью, очень часто требуется предусмотреть возможность
для того, чтобы пользователь мог установить соединение с сетью через прокси-сервер,
эта возможность нужна не только для анонимности, но так же связана с тем, что в
большинстве фирм, из соображений безопасности сети, нет другой возможности выхода
в Интернет, как только через прокси-сервер предприятия.
Для установки прокси-сервера можно воспользоваться классом QNetworkProxy.
QNetworkProxy proxy;
proxy.setType(QNetworkProxy::HttpProxy);
proxy.setHostName("192.168.178.1");
proxy.setPort(8080);
proxy.setUser("user");
proxy.setPassword("password");
QNetworkProxy::setApplicationProxy(proxy).

38.

Контроль освоения обучающимися учебного материала
Контрольный вопрос № 1:
сформулируйте содержание понятия метаобъектная информация
информация о наследовании классов, которая позволяет определять являются ли
классы непосредственными наследниками (узнать имя класса), а также
предоставляет информацию о мета-методах класса
38

39.

Контроль освоения обучающимися учебного материала
Контрольный вопрос № 2:
перечислите основные недостатки использования конструкции вызова
раздела библиотеки
отправка сигналов происходит немного медленнее, чем обычный вызов
функции, который производится при использовании механизма функций
обратного вызова;
существует необходимость в наследовании класса QObject;
в процессе компиляции не производится никаких проверок: имеется ли сигнал
или слот в соответствующих классах или нет; совместимы ли сигнал и слот друг с
другом и могут ли они быть соединены вместе.
39

40.

Задание на самостоятельную работу
Задание:
доработать конспект лекции, изучить подход к внедрению файлов-ресурсов в исполняемые
модули, с целью получения доступа к требуемым ресурсам при запуске приложения;
реализовать в программной среде (Qt Creator) связь разных виджетов между собой: добавить в
приложении три кнопки: увеличение на 1, уменьшение на 1 и сброса значения. Нажатие на эти
кнопки должно приводить к изменению значения на трех элементах управления (текстовое
поле, слайдер, переключатель).
Рекомендуемая литература:
1.
2.
3.
4.
5.
6.
Платонов А.А., Домбровский А.Ф. Методы программирования: курс лекций. Электронное
пособие. – СПб.: ВКА имени А.Ф. Можайского, 2016. – 171 с.
Технологии программирования: учебное пособие / В.В. Мышко, Д.Н. Бородько, В.В. Ткаченко.
– СПб.: ВКА имени А.Ф. Можайского, 2015. – 84 с.
Шлее М. Qt 5.10. Профессиональное программирование на C++. – СПб.: БХВ-Петербург, 2019.
– 912 с.
Программирование на языке С++ в среде Qt Creator: / Е.Р. Алексеев, Г. Г. Злобин, Д. А.Костюк,
О.В.Чеснокова, А.С.Чмыхало М. : ALT Linux, 2015. 448 с. : ил. (Библиотека ALTLinux).
Технологии разработки программного обеспечения: практикум / В.А. Мыльников, В.А.
Лохвицкий, А.С. Марковский. – СПб.: ВКА имени А.Ф. Можайского, 2016. – 150 с.
Qt Reference Documentation.
40
English     Русский Rules