ПРИМЕР: Cинхронизация с помощью событий windows
Primary tabs
Forums:
События - объекты, оценивая состоянии которых , нити могут синхронизировать своё выполнение ("договориться" между собой об очерёдности действий)
Для работы с событиями в windows используются (в частности) следующие функции=
- CreateEvent()- создает объект-событие - имеется возможность определить - как именно будет "сбрасываться" событие.
- SetEvent() - устанавливает событие в сигнальное состояние
- ResetEvent() - сбрасывает событие - то есть переводит его "в не сигналящее" состояние - как бы "отменяет актуальность" (если сравнивать с "жизненными" событиями)))
- PulseEvent() - устанавливает событие - в смысле - переводит объект-событие в "сигналящее" состояние ,а затем- после возобновления ожидающих это событие нитей (всех при ручном сбросе и только одной при автоматическом), сбрасывает его (см. предыдущую в списке функцию - ResetEvent() ). Если ожидающих нитей нет, PulseEvent просто сбрасывает событие.
Пример синхронизации с помощью событий (код отсюда - я просто прокомментирую) =
#include stdio.h> /* заголовочный файл стандартного ввода-вывода -в том числе определят тип FILE */ #include windows.h> /* подключаем определение функций винды */ HANDLE hEvent1, hEvent2; /* объявляем пару глобальных дескрипторов - фактически указателей на любой тип */ int a[5]; HANDLE hThr; unsigned long uThrID; void Thread( void* pParams ) // эта функция будет выполняться в контексте потока, созданного в main(void) функции { int i, num = 0; while (1) // запускаем бесконечный цикл { WaitForSingleObject( hEvent2, INFINITE ); /* приостанавливаем выполнение программы до того времени пока hEvent2 не окажется в сигнальном состоянии (а он при достижении данной "строчки" уже будет прибывать именно в сигнальном состоянии) -вообще в данной программе в обеих функциях проверки WaitForSingleObject не остановят выполнение ни на миг ,так как оба объекта-события main и hEvent2 будут заблоговременно переводится в сигнальное состояние hEvent2- фукции main() , а hEvent1 в функции Thread() */ for (i=0; i<5; i++) a[i] = num; // присваиваем каждому элементу массива значение = переменной num num++; // наращиваем значение num на единицу SetEvent( hEvent1 );// переводим hEvent1 в сигнальное состояние } } /*примечание = http://fkn.ktu10.com/?q=node/642 */ int main( void ) // НАЧАЛО ПРОГРАММЫ - новый поток будет запущен из контекста этой функции { hEvent1=CreateEvent( NULL, FALSE, TRUE, NULL ); /* событие создаётся в сигнальном состоянии , с автоматическим сбросом*/ hEvent2=CreateEvent( NULL, FALSE, FALSE, NULL ); /* событие создаётся в НЕсигнальном состоянии , с автоматическим сбросом */ hThr=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread,NULL,0,&uThrID); while(1) // запускаем бесконечный цикл { WaitForSingleObject( hEvent1, INFINITE ); /* эта функция дожидатся момента, когда событие hEvent1 окажется в "сигнальном состоянии" (изначально событие уже в этом состоянии) - и только после этого продолжит выполнение программы - при этом после продолжения работы hEvent1 будет "сброшено" так как оно создано как "автоматически сбрасываемое (см. примечание )"*/ Sleep( 1000 ); /* это мой дополнение к исходному коду - подождём секунду , а затем выводим строчку , а то всё слишком бчстро)) */ printf("%d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4]); // выводим на экран строчку одинакых чисел равных переменной num SetEvent( hEvent2 ); // переводим hEvent2 в сигнальное состояние } return 0; }
ПРИМЕЧАНИЕ
О приведении типа LPTHREAD_START_ROUTINE читайте здесь
_____________________________________________
Источники(читать подробнее)=
http://www.codeproject.com/KB/threads/Au...
http://www.codenet.ru/progr/cpp/process-...
Ключевые слова и фразы(для поиска)=
Синхронизация нитей в ОС Windows
события си windows
work with events c winapi
события виндовс
- Log in to post comments
- 7407 reads