Уничтожение процесса (потока)

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.

Уничтожение процесса (потока) - student2.ru

Листинг программы для Visual Studio 2008.

Уничтожение процесса (потока) - student2.ru

Порядок выполнения работы

  • Изучить предлагаемый теоретический материал.
  • Создать приложение согласно своему варианту.

Варианты заданий

1.1. Создать приложение №1, которое запускает процесс. Название приложения, которое необходимо запустить вводиться с клавиатуры. Создать приложение №2, которое запускает приложение созданное при выполнении лабораторной работы №1.

1.2. Поиск указанной строки в указанном файле. Обработка одной строки в порожденном процессе (потоке).

1.3. Умножение матрицы на вектор. Обработка одной строки матрицы - в порожденном процессе (потоке).

1.4. Свертка сигнала с импульсной характеристикой фильтра ( Уничтожение процесса (потока) - student2.ru ). N – число отсчетов импульсной характеристики необходимо разбить на несколько диапазонов. Обработка одного диапазона - в порожденном процессе (потоке). В качестве импульсной характеристики можно использовать характеристику идеального НЧ – фильтра: Уничтожение процесса (потока) - student2.ru где Уничтожение процесса (потока) - student2.ru - частота среза (0< Уничтожение процесса (потока) - student2.ru <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 с.

Наши рекомендации