Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС / Лаб_2.doc
Скачиваний:
142
Добавлен:
11.04.2015
Размер:
94.72 Кб
Скачать

Лабораторная работа № 2. Управление процессами и потоками в Win32api. Организация взаимодействия между процессами и потоками вWin32api Цель работы

  1. Изучение основных функций Win 32 API, используемых для управления процессами и потоками.

  2. Изучение организации взаимодействия между процессами и потоками методом посылки сообщений.

  3. Разработка простейшей программы, демонстрирующей создание и завершение процесса.

  4. Разработка простейшей программы, демонстрирующей создание многопоточной программы.

  5. Разработка простейшей программы, демонстрирующей взаимодействие процессов путем посылки сообщений.

Краткие теоретические сведения

К основным функциям Win32 API по управлению процессами и потоками относятся:

  • CreateProcess – создать новый процесс;

  • ExitProcess – завершить текущий процесс и все его потоки (вызывается из какого-либо потока данного процесса);

  • TerminateProcess – завершить текущий процесс и все его потоки (вызывается из любого потока любого процесса);

  • CreateThread – создать новый поток в существующем процессе;

  • ExitThread – завершить этот поток (вызывается из завершаемого потока);

  • TerminateThread – завершить поток (вызывается из любого потока любого процесса);

  • SetPriorityClass – задать класс приоритета для процесса;

  • GetPriorityClass – получить класс приоритета для процесса;

  • SetThreadPriority – задать приоритет для потока;

  • GetThreadPriority – получить приоритет для потока.

Функция CreateProcess имеет следующий прототип:

BOOL CreateProcess(

LPCTSTR lpApplicationName, /*указатель на строку имени исполняемого файла */

LPCTSTR lpCommandLine, /* указатель на командную строку */

LPSECURITY_ATTRIBUTES lpProcessAttributes, /*указатель на атрибуты защиты процесса*/

LPSECURITY_ATTRIBUTES lpThreadAttributes, /*указатель на атрибуты защиты первичного потока*/

BOOL bInheritHandles, /* признак передачи процессу описателей наследуемых объектов */

DWORD dwCreationFlags, /* определяет флаги, воздействующие на способ создания нового процесса */

LPVOID lpEnvironment, /* указатель на блок памяти, хранящий строки переменных окружения, которыми будет пользоваться данный процесс*/

LPTSTR lpCurrentDirectory, /* указатель на имя текущего каталога для вновь создаваемого процесса (если NULL, то наследуется от родительского процесса)*/

LPSTARTUPINFO lpStartupInfo, /* указатель на структуру, описывающую параметры окна, связанного с создаваемым процессом */

LPPROCESS_INFORMATION lpProcessInformation /* указатель на структуру, в которую функция возвращает идентификаторы (глобальный идентификатор и идентификатор, служащий для обращения к объектам в функциях) процесса и первичного потока */

).

Если lpszImageName=NULL, то параметр lpszCommandLine трактуется как имя исполняемого файла, вместе с которым может быть передана и командная строка.

Функция ExitProcess имеет следующий прототип:

VOID ExitProcess(UINT uExitCode).

Параметр uExitCode служит для возврата кода выхода из процесса.

Функция TerminateProcess имеет следующий прототип:

BOOL TerminateProcess(

HANDLE hProcess, /* идентифицирует описатель процесса */

UINT uExitCode /* содержит код завершения процесса */

).

Функция CreateThread имеет следующий прототип:

HANDLE CreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes, /* указатель на атрибуты защиты создаваемого потока */

DWORD dwStackSize, /* начальный размер стека потока в байтах */

LPTHREAD_START_ROUTINE lpStartAddress, /* указатель на функцию потока, то есть на функцию с которой начинается исполнение потока */

LPVOID lpParameter, / аргумент, передаваемый в функцию потока */

DWORD dwCreationFlags, / флаги, управляющие созданием потока */

LPDWORD lpThreadId /* указатель на идентификатор создаваемого потока */

);

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

DWORD WINAPI ThreadFunc(LPVOID lpvThreadParm){

DWORD dwResult = 0;

Return (dwResult);

}.

Функция ExitThread имеет следующий прототип:

VOID ExitThread(DWORD dwExitCode).

Параметр dwExitCode служит для возврата кода выхода из потока.

Функция TerminateThread имеет следующий прототип:

BOOL TerminateThread(

HANDLE hThread, /* идентифицирует описатель потока */

UINT uExitCode /* содержит код завершения потока */

).

Функция SetPriorityClass имеет следующий прототип:

BOOL SetPriorityClass(

HANDLE hProcess, / * идентификатор описателя процесса */

DWORD dwPriorityClass /* значения класса приоритета */

);

Возможны следующие значения параметра dwPriorityClass:

IDLE_PRIORITY_CLASS – простаивающий – потоки процесса выполняются, когда система простаивает (уровень 4);

NORMAL_PRIORITY_CLASS – нормальный;

HIGH_PRIORITY_CLAS – высокий приоритет;

REALTIME_PRIORITY_CLASS – приоритет реального времени.

Функция GetPriorityClass имеет следующий прототип:

WORD GetPriorityClass(

HANDLE hProcess /* идентификатор описателя процесса */

);

Функция GetPriorityClass возвращает класс приоритета процесса.

Функция SetThreadPriority имеет следующий прототип:

BOOL SetThreadPriority(

HANDLE hThread, /* указатель идентификатора описателя потока */

int nPriority /* уровень приоритета потока */

);

Параметр nPriority может принимать следующие значения:

THREAD_PRIORITY_ABOVE_NORMAL – приоритет потока должен быть на 1 единицу больше класса приоритета процесса;

THREAD_PRIORITY_BELOW_NORMAL – приоритет потока должен быть на 1 единицу меньше класса приоритета процесса;

THREAD_PRIORITY_HIGHEST – приоритет потока должен быть на 2 единицы больше класса приоритета процесса;

THREAD_PRIORITY_LOWEST – приоритет потока должен быть на 2 единицы меньше класса приоритета процесса;

THREAD_PRIORITY_NORMAL – приоритет потока должен соответствовать классу приоритета процесса;

THREAD_PRIORITY_TIME_CRITICAL – указывает уровень базового приоритета 15 для классов приоритета процесса IDLE_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, HIGH_PRIORITY_CLASS, и уровень базового приоритета 31 для класса приоритета REALTIME_PRIORITY_CLASS;

THREAD_PRIORITY_IDLE – указывает базовый уровень приоритета 1 для классов приоритета процесса IDLE_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, HIGH_PRIORITY_CLASS, и уровень базового приоритета 16 для класса приоритета процесса REALTIME_PRIORITY_CLASS процесса.

Функция GetThreadPriority имеет следующий прототип:

int GetThreadPriority(

HANDLE hThread /* идентификатор описателя потока */

);

Функция GetThreadPriority возвращает уровень приоритета потока.

Взаимодействие между процессами может быть организовано посредством посылки сообщений их окнам. Для этого служит функция SendMessage.

Функция SendMessage имеет следующий прототип:

LRESULT SendMessage(

HWND hWnd, /* идентификатор дескриптора окна, которому посылается сообщение */

UINT Msg, /* посылаемое сообщение */

WPARAM wParam, /* первый параметр сообщения */

LPARAM lParam /* второй параметр сообщения */

);

Чтобы осуществить передачу данных из одного процесса другому, нужно послать из первого процесса окну второго процесса сообщение WM_COPYDATA: SendMessage(hwndReceiver, WM_COPYDATA, (WPARAM) hwndSender, (LPARAM)&cds). Здесь hwndReceiver - идентификатор дескриптора окна второго процесса; hwndSender - идентификатор дескриптора окна первого процесса; cds – переменная типа COPYDATASTRUCT, определенная следующим образом:

typedef struct tagCOPYDATASTRUCT {

DWORD dwData;

DWORD cbData;

PVOID lpDATA;

} COPYDATASTRUCT;

Чтобы переслать данные другому потоку нужно вначале инициировать переменную cds данного типа. Параметр dwData резервируется для использования в вашей программе. Параметр cbData задает число байт, пересылаемых в другой процесс, а параметр lpData указывает на первый байт данных.

Для определения идентификаторов окон может быть использована функция FindWindow.

Функция FindWindow имеет следующий прототип:

HWND FindWindow(

LPCTSTR lpClassName, /* указатель на строку с именем класса окна */

LPCTSTR lpWindowName /* указатель на строку с именем окна */

).

Если функция выполнилась успешно, то она возвращает идентификатор дескриптора окна, в противном случае – NULL.

Некоторые дополнительные сведения для выполнения упражнений.

Чтобы заставить Windows посылать сообщение WM_TIMER обычной оконной функции приложения, следует вызвать функцию SetTimer. Вызов производится в обработчике сообщения WM_CREATE или в функции WinMain перед циклом обработки сообщения. Для остановки потока сообщений WM_TIMER следует вызвать функцию KillTimer. Обычно ее вызов производится в обработчике сообщения WM_DESTROY или в функции WinMain после цикла обработки сообщений.

Вызов функции SetTimer выглядит следующим образом:

SetTimer(hwnd, iTimerID, iMsecInterval, NULL),

где hwnd – описатель того окна, чья оконная функция будет получать сообщения WM_TIMER, iTimerID – идентификатор таймера (положительное целое), iMsecInterval – 32-х разрядное целое без знака, задающее интервал, через который посылается сообщение WM_TIMER.

Вызов функции KillTimer выглядит следующим образом:

KillTimer (hwnd, iTimerID),

где hwnd – описатель того окна, чья оконная функция получает сообщения WM_TIMER, iTimerID – идентификатор таймера.

Функции преобразования данных (чисел в строки и строк в числа):

double atof(const char *s)

double _wtof(const wchar_t *s)

double _tstof(const TCHAR *s)

int atoi(const char *s)

int _wtoi(const wchar_t *s)

int _tstoi (const TCHAR *s)

long atol(const char *s)

long _wtol(const wchar_t *s)

long _tstol (const TCHAR *s)

char *ecvt(double value, int n, int *dec, int *sign)

char *fcvt(double value, int n, int *dec, int *sign)

char *gcvt(double value, int n, char *buf)

char *itoa(int value, char *s, int radix)

wchar_t *_itow(int value, wchar_t *string, int radix)

TCHAR *_itot(int value, TCHAR *s, int radix)

char *ltoa(long value, char *s, int radix)

wchar_t *_ltow(long value, wchar_t *string, int radix)

TCHAR *_ltot (long value, TCHAR *s, int radix)

double strtod(const char *s, char **endptr)

double wcstod(const wchar_t *s, wchar_t **endptr)

double _tcstod (const TCHAR *s, TCHAR **endptr)

long double _strtold(const char *s, char **endptr)

long double _wcstold(const wchar_t *s, wchar_t **endptr)

long strtol(const char *s, char **endptr, int radix)

long wcstol(const wchar_t *s, wchar_t **endptr, int radix)

long _tcstol (const TCHAR *s, TCHAR **endptr, int radix)

unsigned long strtoul(const char *s, char **endptr, int radix)

unsigned long wcstoul(const wchar_t *s, wchar_t **endptr, int radix)

unsigned long _tcstol(const TCHAR *s, TCHAR **endptr, int radix)

char *ultoa(unsigned long value, char *s, int radix)

wchar_t *_ultow(unsigned long value, wchar_t *string, int radix)

TCHAR *_ultot(unsigned long value, TCHAR *s, int radix)

В этих функциях параметр *s является указателем на строку, value – значение, которое нужно преобразовать, n – число знаков в преобразуемой строке, dec – указывает, где следует ставить десятичную запятую относительно начала строки. Параметр sign указывает знак числа, buf – буфер символов, radix указывает на числовое основание для изменяемого значения, endptr – как правило, равен null. Если же значение этого параметра не равно null, то функция автоматически определяет символ, после которого прекращается просмотр данных.

Для использования этих функций необходимо включить заголовочный файл stdlib.h.

Соседние файлы в папке ОС