Управление потоками в WINDOWS
Разработка многопоточного Win32-приложения, которое использует диалоговое окно для управления потоками процессов. Рассмотрение видов потоков, их состояния и контекста. Создание потока, определение потоковой функции и временных показателей его работы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 18.03.2015 |
Размер файла | 222,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ
БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Факультет информационных технологий и робототехники (ФИТР)
Кафедра программного обеспечения вычислительной техники
и автоматизированных систем
Отчет
по лабораторной работе
Дисциплина: "Системное программирование"
Тема
Управление потоками в WINDOWS
Выполнила:
ст. гр.107322 Коваленко Н.В.
Принял:
доц. Разоренов Н. А.
Минск 2015
Цель работы: изучить основы создания и управления потоками в ОС Windows.
Изучаемые вопросы
Виды потоков, состояния потока.
Структура CONTEXT.
Создание потока.
Относительный приоритет потока.
Потоковая функция.
Функции WinAPI для управления потоками.
Окончание потока.
Время выполнения потока.
Постановка задачи
Разработать многопоточное Win32-приложение, которое использует диалоговое окно для управления потоками процессов. Дизайн диалогового окна задается вариантом, преподавателем или самостоятельно. Для визуализации работы потоков использовать соответствующие элементы управления диалога, графику. Приложение должно содержать три потока. Предусмотреть вывод системной информации о потоках (например, полей CONTEXT, временны параметры и т.д.). В отчете привести диаграмму состояния потоков, копии окон.
Ход работы. Виды потоков, состояния потока
Поток является последовательностью команд, обрабатываемых процессором. В рамках одного процессора могут находиться один или несколько потоков. Процесс предоставляет ресурсы, поток - команды и данные для обработки. Процесс содержащий один поток называется однопоточным, в противном случае - многопоточным.
Многопоточная модель охватывает 2 категории потоков и их комбинацию:
потоки на уровне пользователя ULT (User Level Thread);
потоки на уровне ядра KLT (Kernel Level Thread);
комбинированная модель UKLT.
ULT управляются самим приложением. KLT управляется самим ядром через интерфейс прикладного программирования средств ядра ОС.
Рисунок 1 - состояние потока.
Структура CONTEXT
У каждого потока собственный набор регистров процессора, называемый контекстом потока.
Эта структура с именем CONTEXT отражает состояние регистров процессора на момент последнего исполнения потока. Когда потоку выделяется процессорное время, система инициализирует регистры процессора содержимым контекста и, разумеется, регистр -- указатель команд идентифицирует адрес следующей машинной команды, необходимой для выполнения потока.
Кроме того, в контекст включается указатель стека, который определяет адрес стека» принадлежащего потоку. Получить сведения о текущем состоянии регистров процессора. можно с помощью функции:
BOOL GetThreadContext( HANDLE hThread, PCONTEXT pContext);
В программе(результатах) это выглядит так:
CONTEXT ct; ct.ContextFlags = (CONTEXT_FULL);
if(!GetThreadContext(hThread, &ct)) {return FALSE; }
Рисунок 2 - Контекст первого потока
Создание потока
Для создания потока используется функция CreateThread. В программе поток 1 создается следующим образом:
hThread1 = CreateThread(NULL, 0, First_Thread, hDlg, CREATE_SUSPENDED, &Id1 );
Как и при работе с функцией CreateProcess, для многих параметров можно задавать значения по умолчанию (@ или NULL). Третий параметр не может иметь значение по умолчанию, ему всегда передается адрес функции потока. Четвертый параметр часто используется для организации взаимосвязи вызывающего потока с дочерним потоком. При каждом вызове функции CreateThread система создает объект ядра «поток» с начальным значением счетчика его пользователей, равным единице. Система выделяет память под стек потока из адресного пространства процесса. Новый поток выполняется в адресном пространстве того же процесса, что и родительский поток.
Относительный приоритет потока
Задать приоритет потока можно с помощью функции SetThreadPriority. Так это выглядит в программе:
SetThreadPriority(hThread1, prir);
Эта функция меняет класс приоритета процесса, определяемого описателем hThread1, в соответствии со значением параметра prir. Этот параметр принимает одно из значений: IDLЕ_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, HIGH _PRIORITY_CLASS, REALTIME_PRIORITY_CLASS. При успешном выполнении функция возвращает TRUE; в ином случае -- FALSE. Поскольку SetPriorityClass принимает описатель процесса, то можно изменить приоритет любого процесса, выполняемого в системе, -- если его описатель известен и есть соответствующие права доступа.
многопоточный диалоговый временной контекст
Потоковая функция
Функция потока должна иметь следующий прототип:
DWORD WINAPI ThreadFunc(LPVOID IpvThreadParm) { DWORD dwResult = 0;
return(dwResult);}
Параметр IpvThreadParm функции потока идентичен параметру IpvThreadParm, первоначально передаваемому в CreateThread. Последняя лишь передает этот параметр той функции, с которой начинается выполнение создаваемого потока. Таким образом, данный параметр позволяет передавать функции потока какое-либо инициализирующее значение (просто 32-битное значение или 32-битный указатель на структуру данных с дополнительной информацией).
Пример функции потока, визуализирующий свою работу прогресс-баром, приведен ниже.
DWORD WINAPI TrackBarThread1(PVOID pvParam)
{
int count = 0;
int max_count = 1000;
SendMessage(GetDlgItem(hDlg, IDC_PROGRESS1), PBM_SETRANGE, 0, (LPARAM)MAKELONG(0, 1000));
SendMessage(GetDlgItem(hDlg, IDC_PROGRESS1), PBM_SETSTEP, (WPARAM) TRUE, (LPARAM) 1);
SendMessage(GetDlgItem(hDlg, IDC_PROGRESS1), PBM_SETPOS, 0,(LPARAM) 0);
while(count < max_count)
{
Sleep(10);
++count;
SendMessage(GetDlgItem(hDlg, IDC_PROGRESS1), PBM_STEPIT, 0, 0);
}
return 0;
}
Функции WinAPI для управления потоками
Создание потока:
hThread2 = CreateThread(NULL, 0, Second_Thread, hDlg, CREATE_SUSPENDED, &Id2 );
Назначение потоку относительного приоритета:
SetThreadPriority(hThread2, prir);
Возобновление потока: ResumeThread(hThread1);.
Приостановка потока: SuspendThread(hThread1);.
Получение времени создания, окончания потока и др.:
GetThreadTimes(hThread1,&pftCreationTime1, &pftExitTime1,&pftKernelTime1,&pftUserTime1);
Получение контекста потока:
GetThreadContext(hThread, &ct).
Завершение потока: ExitThread(0); .
Завершение потока извне: TerminateThread(hThread1, 0);.
Окончание потока
Существует несколько способов завершения потока:
1) функция потока возвращает управление
2) вызов функции ExitThread из потока
3) вызов функции TerminateThread
4)завершение процесса, содержащего данный поток
Время выполнения потока
Временные показатели работы потока определяются функцией GetThreadTimes, которая возвращает четыре временных параметра: время создания, время завершения, время выполнения, время выполнения. В программе определение и вывод времени создания потоков можно выполнить следующим образом:
GetThreadTimes(hThread[i],&creationTime,&exitTime,&kernelTime,&userTime);
// Дата и время создания процесса по Гринвичу
FileTimeToSystemTime(&creationTime, &stUTC);
// Конвертируем время создания процесса в местное время
SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);
j+=sprintf(buf+j, "Время создания %d-го потока:%02d/%02d/%d %02d:%02d:%02d\r\n", i+1, stLocal.wDay,
stLocal.wMonth, stLocal.wYear, stLocal.wHour,
stLocal.wMinute, stLocal.wSecond);
// Дата и время завершения процесса по Гринвичу
FileTimeToSystemTime(&exitTime, &stUTC);
// Конвертируем время завершения процесса в местное время
SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);
j+=sprintf(buf+j, "Время завершения %d-го потока: %02d/%02d/%d %02d:%02d:%02d\r\n\n", i+1, stLocal.wDay,
stLocal.wMonth, stLocal.wYear, stLocal.wHour,
stLocal.wMinute, stLocal.wSecond);
Результаты работы программного обеспечения
Рисунок 3 - Результат работы программы
Рисунок 4 - Информация о потоках
Выводы
Потоки -- это последовательность или цикл управления в процессе. Они обладают преимуществами по сравнению с созданием нового процесса, они позволяют создать программу, которая выполняет несколько задач одновременно. Множественные потоки менее требовательны к ресурсам, чем множественные процессы.
Функция CreateThread создает новый поток.
Когда поток завершается при выполнении потоковой функции, или при вызове функций ExitThread или TerminateThread, или при завершении процесса.
Размещено на Allbest.ru
...Подобные документы
Основы организации приложения в Windows. Посылка и передача сообщений для окон. Создание и отображение главного окна приложения. Деактивация приложения, его фазы. Сообщения клавиатуры и функции для работы с ней. Определение состояния отдельных клавиш.
лекция [65,7 K], добавлен 24.06.2009Основные функции и процессы подсистемы управления процессами. Диспетчеризация процессов (потоков). Алгоритмы планирования выполнения потоков. Назначение и разновидности приоритетов в операционных системах. Функции подсистемы управления основной памятью.
презентация [117,7 K], добавлен 20.12.2013Особенности разработки при использовании потоков. Создание, удаление переменных. Свойства, управление потоками. Вызовы для создания мутекс. Причины завершения потока. Методы синхронизации выполнения потоков. Типичная последовательность действий с мутест.
лекция [160,8 K], добавлен 29.07.2012Разработка тестирующего приложения, которое будет наглядно показывать, как должна выглядеть тестирующая программа для вычисления уровня интеллекта. Программная среда разработки, характеристика основных возможностей приложения. Стандартные диалоговые окна.
курсовая работа [716,9 K], добавлен 02.12.2013Разработка приложения с помощью среды Microsoft Visual Studio 2010 Express. Интерфейс приложения. Разработка конечного программного продукта, демонстрирующего работу многопоточного приложения, использующего взаимоисключение на основе критической секции.
лабораторная работа [300,4 K], добавлен 21.07.2012Рассмотрение способов просмотра состояния процессов через диспетер задач в операционной системе Windows: определение взаимосвязи процессов и потоков, времени работы системы в пользовательском режиме. Ознакомление со сведениями о файлах драйверов.
лабораторная работа [3,1 M], добавлен 07.04.2010Разработка приложения, которое будет выполнять функции показа точного времени и точной даты. Определение дополнительных функций разработанного приложения. Рассмотрение основных этапов создания программного продукта. Результаты тестирования приложения.
курсовая работа [2,2 M], добавлен 14.04.2019Проектирование службы Windows и приложения для управления этой службой, которое позволит контролировать данные приложения - запускать и завершать определенные процессы по желанию пользователя через определенные промежутки времени. Инструкция по установке.
курсовая работа [2,8 M], добавлен 05.01.2013Разработка программного кода. Анализ набора функций, необходимых для реализации приложения. Создание компонента Timer. Получение списка имен процессов запущенных на локальном компьютере. Проверка правильности работы программы и соответствия требованиям.
курсовая работа [2,3 M], добавлен 05.01.2013Характеристика разных семейств шрифтов в Windows. Получение хендла шрифта. Функции для работы со шрифтами. Создание собственных шрифтовых ресурсов. Средства для настройки приложений. Работа с принтером: получение контекста устройства, печатание.
курс лекций [34,5 K], добавлен 24.06.2009Реализация программы, созданной средствами языка C#. Предназначение Windows-приложения для решения комплекса задач. Определение состава форм с графиком функции. Вычисление коэффициентов полинома. Создание текстового поля для введения корней многочлена.
курсовая работа [234,8 K], добавлен 13.11.2016Разработка и реализация демонстрационного многопоточного приложения. Выбор основных средств реализации. Описание логики работы приложения и разработка программного обеспечения. Описание пользовательского интерфейса. Реализация потоков в Delphi.
курсовая работа [462,5 K], добавлен 10.08.2014Введение в Microsoft Visual Studio. Диалоговое окно "Восстановленные файлы" интегрированной среды разработки. Веб-обозреватель интегрированной среды разработки. Диалоговое окно "Проверка подлинности прокси-сервера". Сохранение и восстановление файлов.
реферат [22,0 K], добавлен 29.05.2013Программирование в операционной системе Windows. Работа с потоками и процессами ОС. Методы их создания. Основы вызова API-функций. Пример создания диалогового окна без использования файла ресурсов. Разработка программы с помощью 32-битного ассемблера.
курсовая работа [107,6 K], добавлен 18.05.2014История развития реестра Windows, описание разделов, WinApi функции. Аналоги программ других разработчиков. Последовательность проектирования Windows-приложения, которое будет выводить аппаратную характеристику ПК на экран. Руководство пользователя.
курсовая работа [1,2 M], добавлен 23.07.2013Создание приложения, создающего текстовый файл text1.txt и записывающего в него текст. Разработка приложения, открывающего текстовый файл для чтения и считывающего из него текст в окно Memo. Создание приложения, открывающего текстовый файл дополнения.
лабораторная работа [15,8 K], добавлен 15.07.2009Представление системы управления конфликтными потоками как системы массового обслуживания с переменной структурой. Вероятностные свойства процесса управления. Построение имитационной модели системы массового обслуживания, математический аппарат.
дипломная работа [1,4 M], добавлен 27.01.2016Работа с файлами, каталогами и томами в Windows и Win32 API. Функции GetWindowsDirectory и GetSystemDirectory. Примеры работы с томами. Получение и изменение атрибутов файлов. Описание минимального набора базовых функций Windows. Чтение и запись файлов.
лекция [62,7 K], добавлен 24.06.2009Разработка исполняемого Win32 приложения с визуальным интерфейсом, обеспечивающим построение функций принадлежности. Проектирование визуального интерфейса приложения, включающего кнопки доступа к функциям построения графика, полей ввода исходных данных.
дипломная работа [343,8 K], добавлен 06.06.2010Использование драйвера режима ядра и управляющего приложения для создания системных потоков. Имитация обработки данных и организация задержек. Разработка драйвера на языке C++. Конфигурация тестового стенда. Точность изменения задержек и работы таймера.
курсовая работа [182,4 K], добавлен 24.06.2009