Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Wait функции




Объекты ядра

Завершение потоков

Создание потоков

Завершение процессов

Процесс завершается если:

- Входная функция первичного потока возвратила управление.

- Один из потоков процесса вызвал функцию ExitProcess.

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

Когда процесс завершается, все User- и GDI-объекты, созданные процессом, уничтожаются, объекты ядра закрываются (если их не использует другой процесс), адресное пространство процесса уничтожается.

Пример 1. Программа создает процесс "Калькулятор".

 

  #include <windows.h> int main(int argc, char* argv[]) { STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); if(!CreateProcess(NULL, "c:/windows/calc.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) return 0; // Close process and thread handles. CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return 0; }

Первичный поток создается автоматически при создании процесса. Остальные потоки создаются функциями CreateThread и CreateRemoteThread (только в Win NT/2000/XP).

Поток завершается если

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

- Поток самоуничтожается, вызвав ExitThread.

- Другой поток данного или стороннего процесса вызывает TerminateThread.

- Завершается процесс, содержащий данный поток.

 

Если вы используете в своем приложении LibCMt C run-time библиотеку, Microsoft настоятельно рекомендует вместо Win32 API функций использовать их аналоги из C run-time: _beginthread, _beginthreadex, _endthread и _endthreadex.

 

Эти объекты используются системой и пользовательскими приложениями для управления множеством самых разных ресурсов: процессами, потоками, файлами и т.д. Windows позволяет создавать и оперировать с несколькими типами таких объектов, в том числе:

 

 

Kernel object Объект ядра Kernel object Объект ядра
Access token Маркер доступа Module Подгружаемый модуль (DLL)
Change notification Уведомление об изменениях на диске Mutex Мьютекс
I/O completion ports Порт завершения ввода-вывода Pipe Канал
Event Событие Process Процесс
File Файл Semaphore Семафор
File mapping Проекция файла Socket Сокет
Heap Куча Thread Поток
Job Задание Timer Ожидаемый таймер
Mailslot Почтовый слот    

Объект ядра это, по сути, структура, созданная ядром и доступная только ему. В пользовательское приложение передается только описатель (handle) объекта, а управлять объектом ядра можно с помощью функций Win32 API.

Как можно приостановить работу потока? Существует много способов. Вот некоторые из них.

Функция Sleep() приостанавливает работу потока на заданное число миллисекунд. Если в качестве аргумента вы укажите 0 ms, то произойдет следующее. Поток откажется от своего кванта процессорного времени, однако тут же появится в списке потоков готовых к выполнению. Иными словами произойдет намеренное переключение потоков. (Вернее сказать, попытка переключения. Ведь следующим для выполнения потоком вполне может стать тот же самый.)

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

- истечет таймаут ожидания;

- ожидаемый объект перейдет в сигнальное (signaled) состояние.

По возвращаемому значению можно понять, какое из двух событий произошло. Ожидать с помощью wait-функций можно большинство объектов ядра, например, объект "процесс" или "поток", чтобы определить, когда они завершат свою работу.

Функции WaitForMultipleObjects передается сразу массив объектов. Можно ожидать срабатывания сразу всех объектов или какого-то одного из них.

Пример 2. Программа создает два одинаковых потока и ожидает их завершения. Потоки просто выводят текстовое сообщение, которое передано им при инициализации.

 

  #include<windows.h> #include<process.h>   unsigned __stdcall ThreadFunc(void * arg) // Функция потока { char ** str = (char**)arg; MessageBox(0,str[0],str[1],0); _endthreadex(0); return 0; }; int main(int argc, char* argv[]) { char * InitStr1[2] = {"First thread running!","11111"};// строка для первого потока char * InitStr2[2] = {"Second thread running!","22222"};// строка для второго потока unsigned uThreadIDs[2];   HANDLE hThreads[2]; hThreads[0] = (HANDLE)_beginthreadex(NULL, 0, &ThreadFunc, InitStr1, 0,&uThreadIDs[0]); hThreads[1] = (HANDLE)_beginthreadex(NULL, 0, &ThreadFunc, InitStr2, 0,&uThreadIDs[1]);   // Ждем, пока потоки не завершат свою работу WaitForMultipleObjects(2, hThreads, TRUE, INFINITE); // Set no time-out // Закрываем дескрипторы CloseHandle(hThreads[0]); CloseHandle(hThreads[1]); return 0; }



Поделиться с друзьями:


Дата добавления: 2015-05-10; Просмотров: 755; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.