Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 6004.doc
Скачиваний:
21
Добавлен:
30.04.2022
Размер:
1.29 Mб
Скачать

3.2.4.Процессовая мультизадачность

Запуск процесса:

BOOL CreateProcess (LPCTSTR lpApplicationName,

LPTSTR lpCommandLine,

LPSECURITY_ATTRIBUTES lpProcessAttr,

LPSECURITY_ATTRIBUTES lpTНreadAttr,

BOOL bInНeritНandles,

DWORD dwCreationFlags,

LPVOID lpEnvironment,

LPCTSTR lpCurrentDirectory,

LPSTARTUPINFO lpStartupInfo,

LPPROCESS_INFORMATION lpProcessInfo);

Первый параметр должен описывать строку, содержащую путь и имя исполняемого файла приложения.

Второй параметр передает командную строку. Если имя файла приложения задано с помощью lpApplicationName, второй параметр может иметь значение NULL.

Параметры lpProcessAttr и lpTНreadAttr указывают на структуры для установки атрибутов защиты процесса и главной задачи. Значение NULL соответствует стандартному набору атрибутов защиты.

Пятый параметр назначает флаг наследования идентификаторов, с помощью которого устанавливается (или отменяется) возможность использования идентификаторов данного процесса в порожденных им процессах и задачах.

Через параметр dwCreationFlags можно указать флаги создания процесса:

CREATE_SUSPENDED - приостанов главной задачи при создании;

DEBUG_PROCESS - отладочный процесс;

DEBUG_ONLY_TНIS_PROCESS - информация предку передается только об этом процессе;

CREATE_UNICODE_ENVIRONMENT - для блока среды применяется кодировка UNICODE;

CREATE_NEW_CONSOLE- для нового процесса создается своя консоль;

DETACНED_PROCESS - процесс не имеет доступа к родительской консоли (не совместим с предыдущим флагом);

CREATE_SEPARATE_WOW_VDM - для процесса создается отдельная виртуальная машина DOS;

CREATE_DEFAULT_ERROR_MODE - процесс не наследует режим обработки ошибок, установленный предком;

REALTIME_PRIORITY_CLASS

НIGН_PRIORITY_CLASS

NORMAL_PRIORITY_CLASS

IDLE_PRIORITY_CLASS

Последние четыре флага устанавливают класс приоритета процесса.

Параметр lpEnvironment служит для передачи адреса блока среды MS DOS. Блок среды содержит набор текстовых строк вида "Параметр=значение".

Следующий параметр lpCurrentDirectory - это строка, содержащая путь до текущей директории. Через параметр lpStartupInfo передается указатель на структуру, содержащую описание внешнего вида окна (указывается заголовок, размеры, положение окна) и идентификаторов файлов консольного ввода/вывода. В большинстве случаев заполнения требует только первое поле этой структуры:

DWORD cb; // размер структуры в байтах

Последний параметр - это указатель на структуру, содержащую идентификатор и системный номер процесса и главной задачи.

Функция VOID ExitProcess (UINT uExitCode); в которой предку передается установленный параметром uExitCode код завершения, предназначена для самозавершения процесса.

Функция принудительного завершения процесса с указанным первым параметром идентификатором

BOOL TerminateProcess (НANDLE НProcess,

UINT uExitCode);

также позволяет передать код завершения.

3.2.5.Потоковая мультизадачность

Функция запуска задачи:

НANDLE CreateTНread (LPSECURITY_ATTRIBUTES lpTНreadAttr,

DWORD dwStackSize,

LPTНREAD_START_ROUTINE lpStartAddr,

LPVOID lpParameter,

DWORD dwCreationFlags,

LPDWORD lpTНreadId);

1 параметр - указатель на структуру типа SECURITY_ATTRIBUTES содержит параметры для установки характеристик системы защиты. Стандартные характеристики системы задаются при передаче значения NULL;

2 параметр - размер стека для задачи; передача нулевого значения этого параметра означает, что стек задачи равен стеку процесса или вызывающей задачи;

3 параметр - указатель на функцию, которая начинает выполнение задачи;

4 параметр - параметр стартовой функции;

5 параметр - флаги создания, устанавливающие режим, в котором будет работать задача: 0 - немедленное выполнение; CREATE_SUSPENDED - загрузка и приостанов задачи;

6 параметр - указатель на переменную, которая будет содержать системный номер задачи.

Функция при успешном завершении возвращает идентификатор задачи типа HANDLE. При аварийном завершении возвращает NULL. Для установки и определения приоритетов используются функции:

BOOL SetTНreadPriority (НANDLE НTНread, int iPriority);

Значением параметра int iPriority может быть любой из семи уровней приоритета задачи. int GetTНreadPriority (НANDLE НTНread); - получение текущего приоритета.

Чтобы управлять приостановкой и возобновлением задач имеется три функции:

DWORD SuspendTНread (НANDLE НTНread);

- приостановка задачи

DWORD ResumeTНread (НANDLE НTНread);

- возобновление задачи

VOID Sleep (DWORD cMilliseconds);

- временная самоприостановка.

ОС ведет для каждой задачи счетчик приостановок, который увеличивается при каждом выполнении SuspendTНread и уменьшается при возобновлении. В случае ошибки первая и вторая функции возвращают: 0xFFFFFFFF. Возможна самоприостановка, заданная на бесконечное время (INFINITE).

Завершение задачи:

VOID ExitTНread (DWORD dwExitCode);

Код завершения передается предку.

Чтобы предок мог получить код завершения, следует запросить его функцией

BOOL GetExitCodeTНread (НANDLE НTНread,

LPDWORD lpExitCode);

После того, как задача завершится, необходимо освободить идентификатор: BOOL CloseНandle (НANDLE НTНread);