Изучение организации мультипрограммирования в ОС Windows: Методические рекомендации по выполнению лабораторной работы, страница 3

Для создания потока используется функция

HANDLE  CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributesDWORD dwStackSize,  LPTHREAD_START_ROUTINE lpStartAdressLPVOID lpParameterDWORD  dwCreationFlagsLPDWORD  lpThreadId).

Если функция CreateThread()  выполнена успешно, то она возвращает хэндл нового потока и создает в памяти необходимые для управления потоком структуры. При ошибке функция возвращает значение NULL.

Параметры функции:

lpThreadAttributes –указатель на структуру SECURITY_ATTRIBUTES, которая будет содержать дескрипторы безопасности создаваемого процесса;  в Windows95/98 указатель равен NULL, так как этот параметр игнорируется;

dwStackSizeпараметр определяет размер выделяемого процессу стека, если это значение равно 0, то поток будет иметь стек того же размера, что и стек главного потока;

lpStartAdress – начальный адрес (точка входа) функции потока, которая должна иметь прототип вида  DWORDWINAPIThreadFunc(LPVOID);

lpParameter – параметр, передаваемый функции потока, который она может использовать;

dwCreationFlags – параметр определяет дополнительный флаг, управляющий временем создания потока; Если значение флага 0, то выполнение потока начинается немедленно, если флаг устанавливается на значение CREATE_SUSPENDED, то начало выполнения потока будет задерживаться до вызова функции ResumeThread();

lpThreadId – указатель на 32-битовую переменную, в которую записывается идентификатор созданного потока.

Для завершения потока служит функция  VOIDExitThread(DWORDdwExitCode). Её единственный параметр – это код завершения. Функция должна вызываться изнутри потока.

Для аварийного завершения потока, когда он, например, завис и на любые действия пользователя не реагирует, может использоваться функция  BOOLTerminateThread (HANDLEhThreadDWORDdwExitCode).

Функция вызывается извне потока, её параметрами являются хэндл потока и его код возврата.

В Приложении 3 приведен пример программы, в которой для создания потока используется функция CreateThread. После успешного создания поток выводит в каждой итерации цикла  время своего создания, а также номер и идентификатор потока.

Стандартная библиотека С++ поддерживает создание потоков с помощью функции _beginthread(), заголовочный файл process.h. При этом для остановки работы потока можно использовать вызов _endthread(). Справочные сведения по синтаксису функций приведены в Help Borland C++ 5.0. Для применения этих вызовов  следует сделать настройку проекта среды программирования на использование многопоточной организации процесса выполнения программы. В среде Borland C++ 5.0 это можно сделать, если выбрать команду TargetExpert из контекстного меню (по правой кнопке мыши) в окне исходного текста программы и отметить флажок Multithread в окне TargetExpert.

В Приложении 4 приведен пример программы, аналогичной программе Приложения 3, в которой для организации потоков используется вызов _beginthread().

3.   ЗАДАНИЕ   И   ПОРЯДОК  ВЫПОЛНЕНИЯ    РАБОТЫ

1.  Изучите назначение и синтаксис функций WinExec() и ShellExecute(). Используйте для этого раздел 2 методических указаний к лабораторной работе, Help Windows API и рекомендуемую литературу.

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

3.  Изучите синтаксис основной функции для создания процессов CreateProcess(), а также функций завершения процессов ExitProcess() и TerminateProcess(). Обратите внимание на параметры функции CreateProcess().

4.  Ознакомьтесь с демонстрационной программой из Приложения 2, изучите её текст. Скопируйте эту программу, а также используемые вместе с нею файл ресурсов и файл описаний. Откомпилируйте и запустите программу и познакомьтесь с результатами её работы. Рассмотрите возможности изменения параметров CreateProcess().

5.  Изучите функции создания и завершения потоков: CreateThread(), ExitThread() и  TerminateThread(). Ознакомьтесь с примером использования этих функций в программе Приложения 3. Выполните эту программу.

6.  Изучите функции создания и завершения потоков стандартной библиотеки С++: _beginthread(), _endthread(). Ознакомьтесь с примером использования этих функций в программе Приложения 4.

7.  Составьте и выполните программу по индивидуальному заданию.

8.  Оформите отчет, проверьте свою подготовленность по контрольным вопросам и защитите работу.

4.   КОНТРОЛЬНЫЕ     ВОПРОСЫ

1.  Поясните термины «программа», «процесс», «поток».

2.  Что такое ресурсы компьютера?

3.  Может ли процесс в мультипрограммном режиме выполняться быстрее, чем в монопольном?  Поясните детали.

4.  Какие особенности имеет вытесняющая (преимущественная) многозадачность?

5.  Какова роль и особенности организации потоков в Windows?

6.  Какие функции используются для создания процессов в Windows?

7.  Поясните различия в назначении функций WinExec(), ShellExecute() и CreateProcess?

8.  Составьте и выполните программу с ипользоанием функции WinExec().

9.  Составьте и выполните программу с ипользоанием функции ShellExecute().

10.  Объясните назначение и использование параметров lpApplicationName и lpCommandLine функции CreateProcess.

11.  Поясните различия между дескриптором и идентификатором процесса.

12.  Каковы различия в назначении и использовании функций ExitProcess() и TerminateProcess()?