Подія (об'єкт події, event object) в операційній системі Windows — об'єкт для синхронізації виконання процесів (потоків), який може знаходитися у двох станах (сигнальному та несигнальному).
Застосунки (прикладні програми) можуть використовувати об'єкти подій у різних ситуаціях, щоб повідомити потік про виникнення потрібної події. В загальному випадку, об’єкти подій використовують для сигналізації очікуючим потокам про досягнення певних умов виконання програми.
Види об'єктів подій
Бувають події ручного скидання (manual-reset) та автоматичного скидання (auto-reset). Подія ручного скидання, будучи сигнальною, залишається такою, доки не буде вимкнена програмно викликом функції API ResetEvent. Події автоматичного скидання перемикаються у несигнальний стан системою, коли один із очікуючих потоків закінчить роботу.
Робота з подіями
Для створення події використовується функція API CreateEvent. Її опис мовою ::
HANDLE WINAPI CreateEvent( __in_opt LPSECURITY_ATTRIBUTES lpEventAttributes, __in BOOL bManualReset, __in BOOL bInitialState, __in_opt LPCTSTR lpName );
Опис мовою Delphi:
function CreateEvent( lpEventAttributes: PSecurityAttributes; // Атрибути секретності bManualReset, // Задає вид події: ручна (true) чи автоматична (false) bInitialState: BOOL; // Задає початк. стан. Якщо true - сигнальний lpName: PChar // Назва (або nil, якщо не потрібно) ): THandle;
Функція повертає дескриптор створеного об’єкта або нуль у випадку невдачі. Якщо об’єкт події із заданою назвою вже існує, то повертається його дескриптор. При цьому ігноруються параметри bManualReset та bInitialState, а функція GetLastError поверне значення ERROR_ALREADY_EXISTS. Ім’я події не повинно збігатися з іменами існуючих об’єктів типу Semaphore, Mutex, Job, Waitable Timer або File Mapping. Якщо відомо, що подія вже існує, її дескриптор можна отримати функцією OpenEvent. Опис на :
HANDLE WINAPI OpenEvent( __in DWORD dwDesiredAccess, __in BOOL bInheritHandle, __in LPCTSTR lpName );
Опис мовою Delphi:
function OpenEvent( dwDesiredAccess: DWORD; // Задає права доступу до об'єкта bInheritHandle: BOOL; // Вказує, чи може об'єкт успадковуватися // дочірніми процесами lpName: PChar // Ім'я об'єкта ): THandle;
Функція повертає дескриптор об'єкта або нуль у випадку помилки. Параметр dwDesiredAccess може набувати одне з таких значень:
- EVENT_ALL_ACCESS – програма отримує повний доступ до об'єкта;
- EVENT_MODIFY_STATE – програма може змінювати стан об'єкта функціями SetEvent і ResetEvent;
- SYNCHRONIZE – можна використовувати об'єкт події у функціях синхронізації.
Після отримання дескриптора події його можна використовувати. Для цього Windows API надає такі функції: SetEvent, ResetEvent та PulseEvent. Функція SetEvent встановлює об'єкт у сигнальний стан:
BOOL WINAPI SetEvent(__in HANDLE hEvent); // Опис мовою function SetEvent(hEvent: THandle): BOOL; // Опис мовою Delphi
Функція ResetEvent скидає об'єкт, встановлюючи його в несигнальний стан:
BOOL WINAPI ResetEvent(__in HANDLE hEvent); // Опис мовою function ResetEvent(hEvent: THandle): BOOL; // Опис мовою Delphi
Функція PulseEvent встановлює об'єкт у сигнальний стан, дозволяє відпрацювати всім функціям синхронізації, які його очікують, а потім знову скидає об’єкт події.
BOOL WINAPI PulseEvent(__in HANDLE hEvent); // Опис мовою function PulseEvent(hEvent: THandle): BOOL; // Опис мовою Delphi
Приклад використання об'єкта події
Вказаний приклад демонструє, як за допомогою системного об’єкта події програма може отримувати повідомлення про зміни у певному підрозділі (текст програми мовою Delphi) реєстру Windows.
function ThreadFunc(Ptr: Pointer): LongInt; var evnt : THandle; RK : HKey; S : string; begin evnt := CreateEvent(nil, false, false, nil); RegOpenKeyEx(HKEY_CURRENT_USER, 'Software\IC\RegDemo', 0, KEY_READ, RK); RegNotifyChangeKeyValue(RK, true, REG_NOTIFY_CHANGE_LAST_SET, evnt, true); if WaitForSingleObject(evnt, INFINITE) = WAIT_OBJECT_0 then begin S := TimeToStr(Time) + ': У реєстр внесено зміни!'; MessageBox(hWindow, PWideChar(S), 'Ооо!', MB_ICONINFORMATION); end; RegCloseKey(RK); CloseHandle(evnt); end;
Спочатку викликом функції CreateEvent створюється об'єкт події автоматичного скидання, дескриптор якого зберігається у змінній evnt. Після цього відкривається потрібна гілка реєстру та за допомогою функції RegNotifyChangeKeyValue здійснюється підписка на отримання повідомлень про зміни у реєстрі. Таким чином RegNotifyChangeKeyValue пов'язує зміни у реєстрі з об’єктом події evnt. Після цього за допомогою функції WaitForSingleObject здійснюється нескінченне очікування на перехід об’єкта evnt у сигнальний стан.
Якщо у вказану гілку реєстру (Software\IC\RegDemo) внесено зміни, то наш потік отримає відповідний сигнал, і програма видасть відповідне повідомлення (за допомогою функції MessageBox).
Джерела
- MSDN: Event Objects [ 15 жовтня 2012 у Wayback Machine.].
- MSDN: CreateEvent function [ 22 червня 2012 у Wayback Machine.].
- Коноваленко І.В., Федорів П.С. Системне програмування у Windows з прикладами на Delphi, Т:ТНТУ.- 2012 [ 8 грудня 2012 у Wayback Machine.].
- MSDN: OpenEventfunction [ 18 квітня 2012 у Wayback Machine.].
Дивись також
- Багатонитевість
- Нить
- Синхронізація процесів
- Критична секція
- М'ютекс
- Ф'ютекс, швидкий користувацький м'ютекс
Ця стаття не має . |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Podiya ob yekt podiyi event object v operacijnij sistemi Windows ob yekt dlya sinhronizaciyi vikonannya procesiv potokiv yakij mozhe znahoditisya u dvoh stanah signalnomu ta nesignalnomu Zastosunki prikladni programi mozhut vikoristovuvati ob yekti podij u riznih situaciyah shob povidomiti potik pro viniknennya potribnoyi podiyi V zagalnomu vipadku ob yekti podij vikoristovuyut dlya signalizaciyi ochikuyuchim potokam pro dosyagnennya pevnih umov vikonannya programi Vidi ob yektiv podijBuvayut podiyi ruchnogo skidannya manual reset ta avtomatichnogo skidannya auto reset Podiya ruchnogo skidannya buduchi signalnoyu zalishayetsya takoyu doki ne bude vimknena programno viklikom funkciyi API ResetEvent Podiyi avtomatichnogo skidannya peremikayutsya u nesignalnij stan sistemoyu koli odin iz ochikuyuchih potokiv zakinchit robotu Robota z podiyamiDlya stvorennya podiyi vikoristovuyetsya funkciya API CreateEvent Yiyi opis movoyu C HANDLE WINAPI CreateEvent in opt LPSECURITY ATTRIBUTES lpEventAttributes in BOOL bManualReset in BOOL bInitialState in opt LPCTSTR lpName Opis movoyu Delphi function CreateEvent lpEventAttributes PSecurityAttributes Atributi sekretnosti bManualReset Zadaye vid podiyi ruchna true chi avtomatichna false bInitialState BOOL Zadaye pochatk stan Yaksho true signalnij lpName PChar Nazva abo nil yaksho ne potribno THandle Funkciya povertaye deskriptor stvorenogo ob yekta abo nul u vipadku nevdachi Yaksho ob yekt podiyi iz zadanoyu nazvoyu vzhe isnuye to povertayetsya jogo deskriptor Pri comu ignoruyutsya parametri bManualReset ta bInitialState a funkciya GetLastError poverne znachennya ERROR ALREADY EXISTS Im ya podiyi ne povinno zbigatisya z imenami isnuyuchih ob yektiv tipu Semaphore Mutex Job Waitable Timer abo File Mapping Yaksho vidomo sho podiya vzhe isnuye yiyi deskriptor mozhna otrimati funkciyeyu OpenEvent Opis na C HANDLE WINAPI OpenEvent in DWORD dwDesiredAccess in BOOL bInheritHandle in LPCTSTR lpName Opis movoyu Delphi function OpenEvent dwDesiredAccess DWORD Zadaye prava dostupu do ob yekta bInheritHandle BOOL Vkazuye chi mozhe ob yekt uspadkovuvatisya dochirnimi procesami lpName PChar Im ya ob yekta THandle Funkciya povertaye deskriptor ob yekta abo nul u vipadku pomilki Parametr dwDesiredAccess mozhe nabuvati odne z takih znachen EVENT ALL ACCESS programa otrimuye povnij dostup do ob yekta EVENT MODIFY STATE programa mozhe zminyuvati stan ob yekta funkciyami SetEvent i ResetEvent SYNCHRONIZE mozhna vikoristovuvati ob yekt podiyi u funkciyah sinhronizaciyi Pislya otrimannya deskriptora podiyi jogo mozhna vikoristovuvati Dlya cogo Windows API nadaye taki funkciyi SetEvent ResetEvent ta PulseEvent Funkciya SetEvent vstanovlyuye ob yekt u signalnij stan BOOL WINAPI SetEvent in HANDLE hEvent Opis movoyu C function SetEvent hEvent THandle BOOL Opis movoyu Delphi Funkciya ResetEvent skidaye ob yekt vstanovlyuyuchi jogo v nesignalnij stan BOOL WINAPI ResetEvent in HANDLE hEvent Opis movoyu C function ResetEvent hEvent THandle BOOL Opis movoyu Delphi Funkciya PulseEvent vstanovlyuye ob yekt u signalnij stan dozvolyaye vidpracyuvati vsim funkciyam sinhronizaciyi yaki jogo ochikuyut a potim znovu skidaye ob yekt podiyi BOOL WINAPI PulseEvent in HANDLE hEvent Opis movoyu C function PulseEvent hEvent THandle BOOL Opis movoyu DelphiPriklad vikoristannya ob yekta podiyiVkazanij priklad demonstruye yak za dopomogoyu sistemnogo ob yekta podiyi programa mozhe otrimuvati povidomlennya pro zmini u pevnomu pidrozdili tekst programi movoyu Delphi reyestru Windows function ThreadFunc Ptr Pointer LongInt var evnt THandle RK HKey S string begin evnt CreateEvent nil false false nil RegOpenKeyEx HKEY CURRENT USER Software IC RegDemo 0 KEY READ RK RegNotifyChangeKeyValue RK true REG NOTIFY CHANGE LAST SET evnt true if WaitForSingleObject evnt INFINITE WAIT OBJECT 0 then begin S TimeToStr Time U reyestr vneseno zmini MessageBox hWindow PWideChar S Ooo MB ICONINFORMATION end RegCloseKey RK CloseHandle evnt end Spochatku viklikom funkciyi CreateEvent stvoryuyetsya ob yekt podiyi avtomatichnogo skidannya deskriptor yakogo zberigayetsya u zminnij evnt Pislya cogo vidkrivayetsya potribna gilka reyestru ta za dopomogoyu funkciyi RegNotifyChangeKeyValue zdijsnyuyetsya pidpiska na otrimannya povidomlen pro zmini u reyestri Takim chinom RegNotifyChangeKeyValue pov yazuye zmini u reyestri z ob yektom podiyi evnt Pislya cogo za dopomogoyu funkciyi WaitForSingleObject zdijsnyuyetsya neskinchenne ochikuvannya na perehid ob yekta evnt u signalnij stan Yaksho u vkazanu gilku reyestru Software IC RegDemo vneseno zmini to nash potik otrimaye vidpovidnij signal i programa vidast vidpovidne povidomlennya za dopomogoyu funkciyi MessageBox DzherelaMSDN Event Objects 15 zhovtnya 2012 u Wayback Machine MSDN CreateEvent function 22 chervnya 2012 u Wayback Machine Konovalenko I V Fedoriv P S Sistemne programuvannya u Windows z prikladami na Delphi T TNTU 2012 8 grudnya 2012 u Wayback Machine MSDN OpenEventfunction 18 kvitnya 2012 u Wayback Machine Divis takozhBagatonitevist Nit Sinhronizaciya procesiv Kritichna sekciya M yuteks F yuteks shvidkij koristuvackij m yuteks Cya stattya ne maye interviki posilan Vi mozhete dopomogti proyektu znajshovshi ta dodavshi yih do vidpovidnogo elementu Vikidanih