typedef struct

{HANDLE hProcess;

HANDLE hThread;

DWORD dwProcessID;

DWORD dwThread;

} PROCESS_INFORMATION;

Наиболее важными в ней являются поле hProcess, возвращающее хэндл созданного процесса, и поле dwProcessID, возвращающее идентификатор (условный номер) созданного процесса.

Возвращаемое функцией CreateProcess значение типа BOOL позволяет вызывающей программе решить, удачно ли прошел запуск – удалось ли создать процесс. При создании возвращается значение TRUE, иначе – значение FALSE, численно равное нулю. Для использования рассматриваемой функции в программе на языке СИ необходимо подключение директивой #include заголовочного файла windows. h.

Пример, представленный программами Parent. cpp и Child. cpp демонстрируется простейшее использование функции создания процесса.

Программа Parent. cpp

#include <windows. h>

#include <stdio. h>

DWORD CreationFlags;

int main()

{ int k;

DWORD rc;

STARTUPINFO si;

PROCESS_INFORMATION pi;

printf(“Demonstration processes, Main Process\n”);

memset(&si,0,sizeof(STARTUPINFO));

si. cb=sizeof(si);

CreationFlags=NORMAL_PRIORITY_CLASS;

rc=CreateProcess(NULL,”child. exe”,NULL, NULL, FALSE,

CreationFlags, NULL, NULL,&si,&pi);

if (!rc)

{ printf(“Error in creation process, codeError=%ld\n, GetLastError());

getch();return(0);}

printf(“For Child Process:\n”);

printf(“hProcess=%d, hThread=%d, ProcessID=%ld, ThreadID=%ld,

pi. hProcess, pi. hThread, pi. dwProcessID, dwThreadID);

for (k=0;k<10;k++)

НЕ нашли? Не то? Что вы ищете?

{ printf(“I am Parent...(my k=%d)\n, k); Sleep(2000);

CloseHandle(pi. hProcess);CloseHandle(pi. hThread);

Return 0);

}

программа Child. cpp

#include <stdio. h>

#include <windows. h>

int main()

{ int k;

printf(“Demonstration Process, Child Process\n);

for (k=0;k<30;k++)

{ printf(“I am Child... (k=%d)\n\r”,k); Sleep(1000); }

return 0;

}

В конце программы полученные при создании процесса хэндлы закрываются вызовом CloseHandle(). По существу закрываются не сами хэндлы, а связанные с ним управляющие блоки (структуры описания процессов).

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

BOOL TerminateProcess(HANDLE hProcess, UINT uExitCode)

В которой аргумент hProcess задает, какой именно процесс следует завершить, а аргумент uExitCode – код завершения.

Нормальное (не принудительное) завершение процесса с кодом завершения задает функция

VOID ExitProcess(UINT uExitCode),

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

Задание на лабораторную работу:

1.  изучить системные функции мыши для текстового режима MS Windows.

2.  составить программу с использованием изученных функций по указанию преподавателя.

Лабораторная работа № 7

МНОГОПОТОЧНОЕ ПРОГРАММИРОВАНИЕ В WINDOWS NT

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

Главная нить процесса создается автоматически при создании процесса. Если процесс нуждается в дополнительных нитях, то его программа вызывает системные функции создания нити. Обычно нить своей работой реализует действия одной из процедур программы. Теоретически любой нити процесса доступны все части программы, но реально работа организуется так, чтобы нити отвечала отдельная процедура.

В операционной системе Windows накопилось несколько функций порождения нитей. Самой ранней является функция CreateThread, но из-за обнаруженных у нее и нескольких последующих версий недостатков (в редких, но возможных ситуациях), были введены еще несколько, отличающихся по порядку и, частично, по набору аргументов. В настоящее время наиболее безопасной функцией порождения нити является _beginthreadNT, описанной в заголовочном файле process. h и имеющей следующий прототип:

unsigned long _beginthreadNT(void (*proc)(void*), unsigned stack_size, void *arglist,

void *security_attrib, unsigned long flag, unsigned long* tid).

Первым аргументом идет адрес процедуры нити, в стандартном случае эта процедура должна быть функцией без возвращаемого значения (функция типа void) и нетипизированным аргументом (формально типа void*). Процедура нити, созданной функцией _beginthreadNT , должна оканчивать специальной функцией _endthread().

Вторым аргументом указывается размер стека, округляемый практически до значения, кратного 4096.

Третий аргумент arglist задает указатель на строку аргументов, в простейшем случае отсутствия аргументов он может быть задан значением NULL.

Аргумент security_attrib используется в более сложных программах, реализующих всю мощь встроенной защиты в WindowsNT. В обычных случаях его также можно задавать равным NULL.

Пятый аргумент flag служит для задания режима приостановленной при создании нити, что обозначается символической константой CREATE_SUSPENDED. В противном случае (запуск тут же функционирующей нити) этот параметр-флаг устанавливается равным нулю.

Последний параметр функции предназначен для возвращаемого значения идентификатора нити. В случае неудачи при создании нити возвращается число -1, в остальных случаях – хэндл созданной нити, который как переменная может быть описан с типом HANDLE.

Следующий ниже пример иллюстрирует построение и использование нитей.

#include <windows. h>

#include <process. h>

#include <stdio. h>

#include <conio. h>

char lbuk[]=”abcdefghijklmnoprqstuwxy”;

void procthread1(void *arg)

{ int k, j;

for (k=0;k<24;k++)

{ gotoxy(20,k+1);

textcolor(LIGHTBLUE);

for (j=0;j<(int)arg;j++)

cprinf(“%c”,lbuk[k]);

}

}

void procthread2(void *arg)

{ int k, j;

for (k=0;k<24;k++)

{ gotoxy(40,k+1);

textcolor(LIGHTGREEN);

for (j=0;j<(int)arg;j++)

cprinf(“%c”,lbuk[k]);

}

}

void procthread3(void *arg)

{ int k, j;

for (k=0;k<24;k++)

{ gotoxy(60,k+1);

textcolor(RED);

for (j=0;j<(int)arg;j++)

cprinf(“%c”,lbuk[k]);

}

}

void main()

{ HANDLE hthread1,hthread2,hthread3;

unsigned long threadid1,threadid2,threadid3;

int k;

hthread1=(HANDLE)_beginthreadNT(procthread1,4096,(void *)2,NULL,0,&threadid1);

hthread2=(HANDLE)_beginthreadNT(procthread2,4096,(void *)3,NULL,0,&threadid2);

hthread3=(HANDLE)_beginthreadNT(procthread3,4096,(void *)4,NULL,0,&threadid3);

for (k=0;k<24;k++)

{ gotoxy(1,k+1);

textcolor(WHITE);

for (j=0;j<(int)arg;j++)

cprinf(“%c”,lbuk[k]);

}

getchar();

CloseHandle(hthread1);

CloseHandle(hthread2);

CloseHandle(hthread3);

}

Для уничтожения нитей в операционных системах Windows служит системная функция TerminateThread, которая имеет следующий прототип:

BOOL TerminateThread(HANDLE hThread, DWORD dwExitCode).

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

Код возврата из нити, завершившейся самостоятельно или прекращенной приказом TerminateThread, может быть получен в другой нити того же процесса путем вызова вспомогательной функции GetExitCodeThread со следующим прототипом:

BOOL GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode).

Если задача, указанная аргументом hThread в момент запроса кода еще работает, то функция возвращает значение STILL_ACTIVE в качестве значения второго аргумента.

Код возврата из нормально завершающейся нити формирует системная функция ExitThread, имеющая прототип

void ExitThread(DWORD dwExitCode).

Задание на лабораторную работу:

1.  изучить системные функции мыши для текстового режима MS Windows.

2.  составить программу с использованием изученных функций по указанию преподавателя.

ВАРИАНТЫ ЗАДАНИЙ

Лабораторная работа №1. Ввод-вывод в стандартные файлы.

№ вар.

Задание: разработать программу с использованием базовых системных функций ОС WINDOWS, которая ….

8

Вводит символьную строку и число N, отбрасывает от строки последние N символов и выводит оставшуюся часть строки

Лабораторная работа №2. Базовые средства использования файловой системы

№ вар.

Задание: разработать программу с использованием базовых системных функций ОС WINDOWS, которая ….

8

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

Лабораторная работа №3. Функции вывода для консольных устройств

№ вар.

Задание: разработать программу с использованием базовых системных функций ОС WINDOWS, которая ….

8

Изобразить в центре экрана квадратное окно зеленого цвета со стороной 20

Лабораторная работа №4. Функции ввода для консольных устройств

Задание: программа запрашивает пароль, состоящий из трех символьных комбинированных сообщений (пароль указан в варианте задания), выводя при этом вместо вводимых символов символ ‘*’. Если пароль введен правильно, то выводится приветствие ‘Hello, User’. Выход из программы осуществить только после ввода символьной комбинации выхода ( см. вариант задания) с предварительной подсказкой.

№ вар.

Пароль

Выход

…+‘a’

…+‘b’

…+‘c’

8

Shift

LeftAlt

[S] [C] Alt

Alt+’Q’

[C] - включен режим CapsLock;

[N] - включен режим NumLock;

[S] - включен режим ScrollLock.

5. Лабораторная работа № 5. Системные функции мыши для текстового режима

№ вар.

Задание: разработать программу с использованием базовых системных функций ОС WINDOWS, которая выводит в центре экрана текстовую строку из нескольких слов и …

8

Удаляет из строки слово, по которому производится двойной «клик» одновременно с нажатием клавиш ALT. Выход из программы – одновременное нажатие правой кнопки и клавиши CTRL

Лабораторная работа № 6. Программное порождение процессов в Windows NT

Задание: разработать программу, которая при выполнении условия W создает дочерний процесс А, а в противном случае дочерний процесс В, выводит фразу о завершении программы и завершается нажатием клавиши ESC.

№ вар.

Условие W

Задача А

Задача В

8

Нажатие клавиш F2+LeftAlt

Вывести площади равностор-них треуг-ков со сторонами от 1 до20

Вывести все делители числа 297

Лабораторная работа № 7. Многопоточное программирование в Windows NT

Задание: разработать программу, которая создает случайный массив А из 20 целых чисел в диапазоне от 0 до 99, выводит на экран эти числа, создает два потока, которые выполняют с этим массивом задания А и В соответственно. Все потоки выводят результаты своей работы в вертикальные колонки, каждый поток в свою колонку.

№ вар.

Задание А

Задание В

8

Вычисление сумм соседних элементов массива

Последовательное вычисление среднего арифметического соседних чисел

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5