Для создания потока используется функция
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAdress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD 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 (HANDLEhThread, DWORDdwExitCode).
Функция вызывается извне потока, её параметрами являются хэндл потока и его код возврата.
В Приложении 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()?
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.