Уничтожение процесса (потока)
BOOL TerminateProcess(
HANDLE hProcess, // указатель на уничтожаемый объект
UINT uExitCode // код завершения
);
BOOL CloseHandle(
HANDLE hObject // указатель на уничтожаемый объект
);
Обе функции можно применять для уничтожения как процессов, так и потоков, но первая не освобождает занятые ими ресурсы до закрытия указателей. Вторая функция закрывает все открытые объектом ресурсы. Возвращаемые значения обеих функций одинаковы, TRUE при успехе и FALSE при неудаче.
Пример применения:
TerminateProcess(pi[i].hProcess,NO_ERROR);
CloseHandle( pi[i].hProcess );
Ожидание завершения процессов (потоков).
DWORD WaitForSingleObject (
HANDLE hHandle // указатель на ожидаемый объект
DWORD dwMilliseconds // время ожидания объекта
);
Ожидаемым объектом может быть процесс, поток, мьютекс, семафор и другие. Если указатель ожидаемого объекта уничтожен в процессе ожидания, то поведение функции не определено.
Время ожидания объекта задается в миллисекундах. Если время ожидания равно нулю, то функция проверяет состояние объекта и немедленно завершается. Если время ожидания задано константой INFINITE, то время ожидания бесконечно.
Возвращаемое значение может быть представлено константой WAIT_OBJECT_0, если ожидаемый объект сигнализировал о своем завершении, или WAIT_TIMEOUT, если время ожидания истекло.
DWORD WaitForMultipleObjects (
DWORD nCount, //количество указателей на объекты в массиве
CONST HANDLE * lpHandles,// массив указателей на ожидаемые объекты
BOOL bWaitAll, // TRUE – ждать всех, FALSE – хотя бы одного
DWORD dwMilliseconds // время ожидания объекта
);
Параметры аналогичны родственной функции WaitForSingleObject. Возвращаемое значение может быть представлено константой WAIT_OBJECT_0, если bWaitAll=TRUE, или значением в диапазоне от WAIT_OBJECT_0 до WAIT_OBJECT_0+nCount-1, если bWaitAll=FALSE (номер завершившегося объекта), или WAIT_TIMEOUT, если время ожидания истекло.
Пример применения:
//WaitForMultipleObjects(num, hThread, TRUE, INFINITE);
for (i = 0; i < num; i++) {
printf("Process %Lu is %Lu\n",hThread[i], WaitForSingleObject (hThread[i], INFINITE)); }
Приведенное ниже приложение CreateMyProcess демонстрирует, как можно вызвать из вашей программы стандартное приложение Windows Калькулятор (calc.exe).
Листинг программы для Visual Studio 2005.
Листинг программы для Visual Studio 2008.
Порядок выполнения работы
- Изучить предлагаемый теоретический материал.
- Создать приложение согласно своему варианту.
Варианты заданий
1.1. Создать приложение №1, которое запускает процесс. Название приложения, которое необходимо запустить вводиться с клавиатуры. Создать приложение №2, которое запускает приложение созданное при выполнении лабораторной работы №1.
1.2. Поиск указанной строки в указанном файле. Обработка одной строки в порожденном процессе (потоке).
1.3. Умножение матрицы на вектор. Обработка одной строки матрицы - в порожденном процессе (потоке).
1.4. Свертка сигнала с импульсной характеристикой фильтра ( ). N – число отсчетов импульсной характеристики необходимо разбить на несколько диапазонов. Обработка одного диапазона - в порожденном процессе (потоке). В качестве импульсной характеристики можно использовать характеристику идеального НЧ – фильтра: где - частота среза (0< <0.5) .
1.5. Поиск всех простых чисел (простым называется число, которое является своим наибольшим делителем) в указанном интервале чисел, разделенном на несколько диапазонов. Обработка каждого диапазона производится в порожденном процессе (потоке). Классический алгоритм Евклида определения наибольшего общего делителя двух целых чисел (x, y) может применяться при следующих условиях:
· оба числа x и y неотрицательные;
· оба числа x и y отличны от нуля.
На каждом шаге алгоритма выполняются сравнения:
· если x == y, то ответ найден;
· если x < y, то y заменяется значением y - x;
· если x > y, то x заменяется значением x - y.
1.6. Warcraft. Заданное количество юнитов добывают золото равными порциями из одной шахты, задерживаясь в пути на случайное время, до ее истощения. Работа каждого юнита реализуется в порожденном процессе (потоке).
1.7. Винни-Пух и пчелы. Заданное количество пчел добывают мед равными порциями, задерживаясь в пути на случайное время. Винни-Пух потребляет мед порциями заданной величины за заданное время и столько же времени может прожить без питания. Работа каждой пчелы реализуется в порожденном процессе (потоке).
1.8. Шарики. Координаты заданного количества шариков изменяются на случайную величину по вертикали и горизонтали. При выпадении шарика за нижнюю границу допустимой области шарик исчезает. Изменение координат каждого шарика в отдельном процессе (потоке).
1.9. Противостояние нескольких команд. Каждая команда увеличивается на случайное количество бойцов и убивает случайное количество бойцов участника. Борьба каждой команды реализуется в отдельном процессе (потоке).
1.10. Статистический анализ. Имеется несколько массивов данных (разного размера). Требуется определить математическое ожидание в каждом массиве. Обработка каждого массива выполняется в отдельном процессе (потоке).
1.11. Контрольная сумма. Для нескольких файлов (разного размера) требуется вычислить контрольную сумму (сумму кодов всех символов файла). Обработка каждого файла выполняется в отдельном процессе (потоке).
1.12. Авиаразведка. Создается условная карта в виде матрицы, размерность которой определяет размер карты, содержащей произвольное количество единиц (целей) в произвольных ячейках. Из произвольной точки карты стартуют несколько разведчиков (процессов, потоков), курсы которых выбираются так, чтобы покрыть максимальную площадь карты. Каждый разведчик фиксирует цели, чьи координаты совпадают с его координатами и по достижении границ карты сообщает количество обнаруженных целей.
1.13. Бег с препятствиями. Создается условная карта трассы в виде матрицы, ширина которой соответствует количеству бегунов, а высота – фиксирована, содержащей произвольное количество единиц (препятствий) в произвольных ячейках. Стартующие бегуны (процессы, потоки) перемещаются по трассе и при встрече с препятствием задерживаются на фиксированное время. По достижении финиша бегуны сообщают свой номер.
5. Литература:
1. Щупак Ю. А. Win32 API. Эффективная разработка приложений. – СПб.: Питер, 2007. — 572 с.