- •Введение
- •1. Лабораторная работа № 1
- •1.1. Цель работы
- •1.2. Теоретическое введение
- •1.2.1. Получение информации об операционной системе
- •1.2.2. Получение информации из реестра
- •1.2.3. Получение информации о системных каталогах Windows
- •1.2.4. Получение информации о диске
- •1.3. Создание приложения для получения характеристик компьютера и операционной системы
- •Контрольные вопросы
- •2. Лабораторная работа №2
- •2.1.Цель работы
- •2.2. Теоретическое введение
- •2.2.1. Процедуры и функции для работы с виртуальной памятью
- •2.3. Создание приложения, работающего с виртуальной памятью
- •2.4. Задание для самостоятельной работы
- •Контрольные вопросы
- •3. Лабораторная работа № 3
- •3.1. Цель работы
- •3.2. Пример использования механизма выделения виртуальной памяти для решения конкретных задач
- •3.3. Задания для самостоятельной работы
- •Контрольные вопросы
- •4. Лабораторная работа № 4
- •4.1. Цель работы
- •4. 2. Теоретическое введение
- •4.2.1 Создание или открытие объекта ядра «файла»
- •4.2.2 Создание объекта ядра «файл, проецируемый в память»
- •4.2.3 Проецирование файловых данных на адресное пространство процесса
- •4.2.4 Отмена проецирования на адресное пространство процесса объекта ядра «файл, проецируемый в память»
- •4.2.5 Закрытие объектов ядра «файл, проецируемый в память» и «файл»
- •4.3 Примеры программ, выполняющих проецирование в память
- •4.3.1 Пример 1
- •4.3.2 Пример 2
- •4.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •5. Лабораторная работа № 5
- •5.1.Цель работы
- •5.2. Теоретическое введение
- •5.2.1. Создание процесса
- •5.2.2. Запуск внешней программы функцией WinExec
- •5.2.3. Запуск внешней программы и открытие документа функцией ShellExecute
- •При успешном выполнении функция ShellExecute возвращает целое значение, большее 32. Значение меньшее или равное 32 указывает на ошибку. Значения эти те же, что и для функции WinExec.
- •5.2.4. Создание потока
- •5.2.5. Завершение процесса
- •5.2.6. Завершение потока
- •5.2.7. Изменение класса приоритета процесса
- •5.2.8. Получение информации о классе приоритета процесса
- •5.2.9. Изменение уровня приоритета потока
- •5.2.10. Получение информации о приоритете потока
- •5.3. Примеры программ для работы с процессами и потоками
- •5.3.1. Создание процесса с помощью функции CreateProcess.
- •5.3.2. Создание процесса с помощью функции WinExec.
- •5.3.3. Создание процесса с помощью функции ShellExecute.
- •5.3.4. Создание многопоточного приложения.
- •5.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •6. Лабораторная работа № 6
- •6.1. Цель работы
- •6.2. Теоретическое введение
- •6.2.1. Получение «мгновенного снимка» системы
- •6.2.2. Получение информации о процессах
- •6.2.3. Получение информации о потоках
- •6.2.4. Получение информации о модулях
- •6.2.5. Информация о кучах (heap)
- •6.2.6. Информация о виртуальной памяти.
- •6.2.7. Алгоритм работы функций ToolHelp
- •6.2.8. Как получить карту памяти любого процесса
- •6.3. Пример использования функций ToolHelp
- •6.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •7. Лабораторная работа № 7
- •7.1. Цель работы
- •7.2. Теоретическое введение
- •7.2.1. Критические секции
- •7.2.2. Синхронизация с использованием объектов ядра
- •7.2.3. Wait-функции
- •7.2.4. Синхронизация с использованием процессов и потоков
- •7.2.5. Объекты Mutex
- •7.2.6. Семафоры
- •7.2.7. События
- •7.3 Примеры работы с объектами синхронизации
- •7.3.1 Пример 1
- •7.3.1 Пример 2
- •7.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •8. Лабораторная работа № 8
- •8.1. Цель работы
- •8.2 Теоретическое введение
- •8.2.1 Создание dll
- •8.2.2 Неявная загрузка dll
- •8.2.3 Явная загрузка dll
- •8.2.4 Внедрение dll в адресное пространство другого процесса
- •8.3 Пример работы с dll
- •8.3.1 Создание dll, которая выполняет перехват нажатых клавиш
- •8.3.2 Разработка приложения, которое выполняет анализ и обработку нажатых клавиш.
- •8.4 Индивидуальные задания
- •Контрольные вопросы
- •9.2.2. Функции для работы с объектом «уведомление об изменении файловой системы»
- •9.3. Пример работы системы уведомления об изменениях в файловой системе
- •9.4. Задания для самостоятельной работы
- •Контрольные вопросы
- •Литература
- •214013 Г. Смоленск, Энергетический проезд, 1
7.3.1 Пример 2
С помощью объектов синхронизации Windows создать модель вычислительной сети. Сеть состоит из одного сервера, к которым обращаются с запросами клиенты. Запросы клиентов поступают через случайные промежутки времени. У сервера ограниченный размер числа одновременно обрабатываемых запросов. Запрос каждого клиента обрабатывается в течение некоторого времени.
Данное приложение работает следующим образом: имеется два потока Thread1 и Thread 2. Поток Thread2 принимает запрос клиента, поток Thread1 реализует процесс обслуживания очередного запроса на сервере. Количество одновременно обслуживаемых запросов регулируется семафором. Приложение, реализующее данную задачу изображено на рисунке 7.2.
Для создания данного выполните следующие действия:
Объявите глобальные переменные:
var
Form1: TForm1;
//Дескриптор потока, создающего поток Thread2
hThread2:THandle;
// Массив потоков обслуживания запросов клиентов
hThread1:Array[0..1000] of THandle;
// Идентификаторы соответствующих потоков
ThreadId2:DWORD;
ThreadId1:Array[0..1000] of DWORD;
// Дескриптор семафора
serv1:tHandle;
// Номер очередного поступившего запроса
q:Integer;
// Максимально допустимое число запросов
zapr:Integer;
Создайте процедуру Thread1, следующего вида:
procedure Thread1;
Var q1:Integer;
Begin
// Запомнить номер очередного обрабатываемого запроса
q1:=q;
// Если сервер свободен , запрос обрабатывается
WaitForSingleObject(serv1,INFINITE);
// Запрос обрабатывается при условии,
// что номер запроса - положительное число
If q1>0 then
Begin
// Случайное время выполнения звапроса
Sleep(1000+Random(2000));
// Вывод информации о завершении обработки запроса с номером q1
Form1.Memo1.Lines.Add('Обработан запрос номер '+IntToStr(q1));
end;
// Сервер освобождается для обработки других запросов
ReleaseSemaphore(serv1,1,nil);
end;
Создайте процедуру Thread1, следующего вида:
procedure Thread2;
begin
// Создается очередной запрос, если общее число созданных запросов
// меньше числа zapr, вводимого с клавиатуры
While q<zapr do
Begin
// Запросы поступают через случайный интервал времени
Sleep(100+Random(200));
// Увеличиваем на 1 число поступивших запросов
q:=q+1;
Form1.Edit3.Text:=IntToStr(q);
// Создаем поток, для обслуживания поступившего запроса
hThread1[q]:=CreateThread(nil,0,@Thread1,nil,0,ThreadID1[q]);
end;
end;
Для события OnClick кнопки Button1 введите следующий программный код:
procedure TForm1.Button1Click(Sender: TObject);
Var
res:Integer;
begin
Memo1.Clear;
// очищаем счетчик числа поступивших запросов
q:=0;
// ввод числа одновременно обслуживаемых на сервере запросов
// это число требуется для настройки семафора
res:=StrToInt(Edit1.text);
// ввод максимального числа запросов
zapr:=StrToInt(Edit2.text);
// создание семафора
serv1:=CreateSemaphore(nil,res,res,nil);
// создание потока, предназначенного для приема запросов клиентов
hThread2:=CreateThread(nil,0,@Thread2,nil,0,ThreadID2);
end;
Для события OnClick кнопки Button2 введите следующий программный код:
procedure TForm1.Button2Click(Sender: TObject);
begin
Application.Terminate;
end;
Откомпилируйте приложение и проверьте его работу.