Кіріспе
Бағдарламалау жобалау үлгісі. Компьютер ғылымында, оқиға циклы – бағдарламада оқиғаларды немесе хабарларды күтіп, оларды жіберуге арналған бағдарламалау құрылымы немесе жобалау үлгісі. Оқиға циклы, ішкі немесе сыртқы "оқиға жеткізушіге" (әдетте оқиға келгенше сұрауды тоқтатып тұрады) сұрау жіберу арқылы жұмыс істейді, содан кейін тиісті оқиғаны өңдеушіні шақырады ("оқиғаны жібереді"). Оқиға циклы кейде хабарлама диспетчері, хабарлама циклы, хабарлама сорғысы немесе орындалу циклы деп те аталады. Бұл веб-серверлер сияқты серверлерді жүзеге асыру үшін де жиі қолданылатын әдіс. Оқиға циклы, егер оқиға жеткізуші файл интерфейсін қолданса, реактормен бірге қолданылуы мүмкін, оны таңдауға немесе "сұрауға" болады (Unix жүйелік шақыру, нақты сұрау емес). Оқиға циклы дерлік әрқашан хабардың бастау көзімен асинхронды түрде жұмыс істейді. Оқиға циклы бағдарламаның басты басқару ағыны құрылымын құраса, оны көбінесе негізгі цикл немесе басты оқиға циклы деп атайды. Бұл атау лайықты, себебі мұндай оқиға циклы бағдарламаның ең жоғары деңгейдегі басқаруын қамтамасыз етеді.
In computer science, the event loop is a programming construct or design pattern that waits for and dispatches events or messages in a program. The event loop works by making a request to some internal or external "event provider" (that generally blocks the request until an event has arrived), then calls the relevant event handler ("dispatches the event"). The event loop is also sometimes referred to as the message dispatcher, message loop, message pump, or run loop. It is also a common method used to implement servers like web servers. The event loop may be used in conjunction with a reactor, if the event provider follows the file interface, which can be selected or 'polled' (the Unix system call, not actual polling). The event loop almost always operates asynchronously with the message originator. When the event loop forms the central control flow construct of a program, as it often does, it may be termed the main loop or main event loop. This title is appropriate, because such an event loop is at the highest level of control within the program.
Хабарды жіберу
Хабарлар сорғылары бағдарламаның хабарлар кезегінен (операциялық жүйе беріп, әдетте оған тиесілі) хабарларды өңдеу үшін бағдарламаға 'жібереді' дейді. Ең нақты мағынасында, оқиғалар циклы – процестер аралық байланысты іске асырудың бір жолы. Шындығында, хабарларды өңдеу көптеген жүйелерде бар, оның ішінде Mach операциялық жүйесінің ядролық деңгейіндегі компонентінде де. Оқиғалар циклы – хабар алмасуды қолданатын жүйелердің нақты іске асыру техникасы.
Сигналдарды басқару
Unix-те файлдық интерфейске сәйкес келмейтін сирек нәрселердің бірі – асинхронды оқиғалар (сигналдар). Сигналдар сигналды өңдеушілерде қабылданады, бұл қалған тапсырма тоқтап тұрғанда жұмыс істейтін шағын, шектеулі код бөліктері; егер тапсырма select функциясында тоқтап тұрғанда сигнал келіп, өңделсе, select EINTR кодымен ертерек қайтарылады; егер тапсырма процессорлық жүктемемен айналысса, сигналды өңдеуші қайтып келгенге дейін тапсырма нұсқаулар арасында тоқтатылады. Осылайша, сигналдарды өңдеудің қарапайым жолы – сигналды өңдеушілерде жаһандық белгіні орнату және select функциясын шақыру алдында және кейін дереу сол белгіні тексеру. Егер белгі орнатылған болса, сигналды файл дескрипторларындағы оқиғалар сияқты өңдеуге болады. Алайда, мұндай жағдайда жарыс жағдайы туындайды: егер сигнал белгіні тексеру мен select функциясын шақыру арасында келіп жетсе, ол select басқа себеппен қайтарылғанша (мысалы, ашуланған пайдаланушы тоқтатқанша) өңделмейді. POSIX ұсынған шешім – pselect функциясы, ол select функциясына ұқсас, бірақ қосымша сигмаска параметрін қабылдайды, ол сигнал маскасын сипаттайды. Бұл бағдарламаға негізгі тапсырмада сигналдарды жасыруға және select функциясының орындалу барысында масканы алып тастауға мүмкіндік береді, соның салдарынан сигналды өңдеушілер тек бағдарлама кіріс-шығыс операцияларымен айналысқанда ғана шақырылады. Дегенмен, pselect функциясының іске асырылуы әрқашан сенімді болған жоқ; Linux-тың 2.6.16 нұсқасына дейінгі нұсқаларында pselect жүйелік шақыруы болмаған, сондықтан glibc оны дәл сол жарыс жағдайына бейім әдіс арқылы эмуляциялауға мәжбүр болды. Балама, көбірек тасымалдамалы шешім – асинхронды оқиғаларды файлдық оқиғаларға түрлендіру, мұнда «сигналды өңдеуші құбырға байт жазады, ал оның екінші ұшы негізгі бағдарламада select арқылы бақыланады». Linux ядросының 2.6.22 нұсқасында signalfd жаңа жүйелік шақыруы қосылды, ол арнайы файл дескрипторы арқылы сигналдарды қабылдауға мүмкіндік береді.
HTML/Javascript
Веб-бет және оның JavaScript коды әдетте бір жіпті веб-браузер процесінде жұмыс істейді. Браузер процесі кезектегі хабарламаларды бірінен соң бірін өңдейді. Әрбір хабарламаға JavaScript функциясы немесе басқа браузер оқиғасы сәйкес келуі мүмкін. Браузер процесі хабарламаны өңдеп болғаннан кейін кезектегі келесі хабарламаға көшеді.
Windows қолданбалары
Microsoft Windows операциялық жүйесінде пайдаланушымен өзара әрекеттесетін процесс кіріс хабарламаларды қабылдап, оларға жауап беруі керек, бұл процесте хабарлама циклы арқылы міндетті түрде жүзеге асырылады. Windows жүйесінде хабарлама – бұл операциялық жүйеде жасалған және оған жіберілген оқиғамен тең. Оқиға пайдаланушының өзара әрекеттесуі, желілік трафик, жүйелік өңдеу, таймерлік белсенділік, процестер аралық байланыс және тағы да басқалар болуы мүмкін. Интерактивті емес, тек I/O оқиғалары үшін Windows-та I/O аяқтау порттары қарастырылған. I/O аяқтау порттарының циклдары хабарлама циклынан бөлек жұмыс істейді және бастапқыда хабарлама циклымен өзара әрекеттеспейді. Көптеген Win32 қолданбаларының "жүрегі" – цикл бойынша GetMessage функциясын шақыратын WinMain функциясы. GetMessage хабарлама немесе "оқиға" алынғанға дейін күйтеді (блоктау емес нұсқасы ретінде PeekMessage функциясы қолданылады). Кейбір қосымша өңдеуден кейін ол DispatchMessage функциясын шақырады, ол хабарламаны тиісті өңдеушіге, яғни WindowProc-қа жібереді. Әдетте, ерекше WindowProc-ы жоқ хабарламалар DefWindowProc-қа жіберіледі, ол стандартты өңдеуші болып табылады. DispatchMessage функциясы хабарламаның HWND тұтқасының WindowProc-ын шақырады (RegisterClass функциясы арқылы тіркелген).
Хабарларды реттеу
Microsoft Windows-тың соңғы нұсқалары бағдарламашыға жүйе және оның сыртқы құрылғылары қабылдаған ретпен хабарламалар бағдарламаның хабарлама цикліне жеткізілетініне кепілдік береді. Бұл кепілдік көп өрісті (көп жіпті) қолданбалардың құрылымдық ерекшеліктерін ескергенде аса маңызды. Дегенмен, кейбір хабарламалар үшін ерекше ережелер бар, мысалы, әрқашан соңынан келетін немесе құжаттамада басқа басымдық деңгейі көрсетілген хабарламалар.
Xlib оқиғалар циклы
Xlib-ті тікелей пайдаланатын X қолданбалары XNextEvent функциялар отбасы негізінде құрылған; XNextEvent оқиға кезегінде оқиға пайда болғанға дейін тоқтатылады, содан кейін қолданба оны тиісінше өңдейді. Xlib оқиға циклы тек терезе жүйесінің оқиғаларын ғана басқарады; басқа файлдар мен құрылғыларда күтуге қабілетті болуы керек қолданбалар ConnectionNumber сияқты негізгі элементтерден өз оқиға циклын құра алады, бірақ практикада көбінесе көп жіптілікті пайдаланады. Xlib-ті тікелей пайдаланатын бағдарламалар өте сирек. Көбінесе GUI құралдар жиынтығы Xlib негізінде болады және оқиғаларды қосу мүмкіндігін ұсынады. Мысалы, Xt Intrinsics негізіндегі құралдар жиынтығында XtAppAddInput және XtAppAddTimeout функциялары бар. Xlib функцияларын сигнал өңдеушіден шақыру қауіпсіз емес, себебі X қолданбасы кездейсоқ күйде үзілуі мүмкін, мысалы, XNextEvent ішінде. X11R5, X11R6 және Xt үшін шешімдерді қараңыз.
Please note that it is not safe to call Xlib functions from a signal handler, because the X application may have been interrupted in an arbitrary state, e. g. within XNextEvent. See for a solution for X11R5, X11R6 and Xt.
GLib оқиғалар циклы
GLib оқиға циклы бастапқыда GTK үшін жасалған, бірақ қазір D Bus сияқты GUI емес қолданбаларда да қолданылады. Бақыланатын ресурс – қолданба қызығушылық танытқан файл дескрипторларының жиынтығы; сигнал келсе немесе белгілі бір уақыт өтсе (мысалы, қолданба уақытты шектеу немесе бос тапсырманы көрсеткен жағдайда) дауыс беру блогы тоқтатылады. GLib файл дескрипторлары мен процестердің аяқталу оқиғаларын қолдауға енгізілген, бірақ дайындық тексеру, жіберу үлгісінде өңделе алатын кез келген оқиға үшін оқиға көзін қосу мүмкіндігі бар. GLib оқиға циклы негізінде құрылған қолданба кітапханаларына GStreamer және GnomeVFS асинхронды I/O әдістері жатады, бірақ GTK ең көп көрінетін клиент кітапханасы болып табылады. Терезе жүйесінен келетін оқиғалар (X жүйесінде X сокетінен оқылатын) GDK арқылы GTK оқиғаларына аударылып, қолданбаның виджеттерінде GLib сигналдары ретінде жіберіледі.
macOS Core Foundation орындалу циклдары
Бір жіпке дәл бір CFRunLoop рұқсат етіледі, ал кез келген мөлшерде көздер мен бақылаушыларды қосуға болады. Көздер жүгіру циклы арқылы бақылаушылармен байланысады, ол хабарларды кезекке қоюды және жіберуді ұйымдастырады. CFRunLoop Cocoa жүйесінде NSRunLoop ретінде абстракцияланады, бұл кез келген хабарламаны (рефлексияланбаған орындалу уақытындағы функция шақыруымен тең) кез келген нысанға жіберу үшін кезекке қоюға мүмкіндік береді.