Microsoft Windows жүйесіндегі хабарлама циклі - Message loop in Microsoft Windows

The хабарлама циклі тармағының міндетті бөлімі болып табылады код әрқайсысында бағдарлама а қолданады графикалық интерфейс астында Microsoft Windows.qWindows бағдарламалары GUI болып табылады оқиғаға негізделген. Windows жеке тұлғаны қолдайды хабарлама кезегі терезе жасаған әрбір жіп үшін. Әдетте тек бірінші жіп терезелерді жасайды. Windows орындары хабарламалар кезекке осы ағынның терезесінде тышқанның әрекеті пайда болған кезде, сол терезеде фокус болған кезде пернетақтаның әрекеті болған кезде және басқа уақытта. Процесс хабарламаларды өз кезегіне қоса алады. Пайдаланушының кірісін қабылдау үшін және басқа да себептермен терезесі бар әрбір ағын өз кезегінен хабарламаларды үздіксіз алып отыруы және сол бойынша әрекет етуі керек. Бағдарламалаушы процедураны а жазу арқылы жасайды цикл ол GetMessage (хабарламаны блоктайтын және оны шығаратын) шақырады, содан кейін DispatchMessage (хабарламаны жібереді) шақырады және шексіз қайталанады. Бұл хабарлама циклі. Әдетте. Ішінде хабарлама циклі болады негізгі бағдарлама, ол негізгі жұмыс істейді жіп және әрбір құрылған модальді диалогтағы қосымша хабарлама циклі. Хабарламалар әрқайсысы процестің терезесі оның хабарламалар кезегінен өтіп, оның хабарламалар циклі арқылы өңделеді. Хабарлама циклі - бұл бір түрі оқиға циклі.

Хабарламаның негізгі циклі келесідей болады:

int WINAPI WinMain(ТЫС hInstance, ТЫС hPrevInstance, LPSTR lpCmdLine, int nCmdShow){    MSG msg;    BOOL bRet;    уақыт (1)    {        bRet = GetMessage(&msg, ЖОҚ, 0, 0);        егер (bRet > 0)  // (bRet> 0 өңдеу керек хабарламаны көрсетеді.)        {            TranslateMessage(&msg);            Жіберу хабарламасы(&msg);        }        басқа егер (bRet < 0)  // (bRet == -1 қатені білдіреді.)        {            // Қатені өңдеу немесе тіркеу; мүмкін шығу.            // ...        }        басқа  // (bRet == 0 «бағдарламадан шығу» дегенді білдіреді.)        {            үзіліс;        }    }    қайту msg.wParam;}

Іс-шара циклі үшін қоңырау шалу әдеттегідей TranslateMessage виртуалды пернелерді түрлендіруге болатын әр хабарламада жіптер. Қоңырау шалу TranslateMessage техникалық жағынан талап етілмейді, бірақ егер ол шақырылмаса, проблемалар туындауы мүмкін. Хабарлама циклы қоңырау шалуы керек Жіберу хабарламасы.

Хабарлама циклы ол өңдейтін хабарламаларға тікелей әсер етпейді. Ол оларды қоңырау шалу арқылы жібереді Жіберу хабарламасы, ол хабарлама жіберілген терезе үшін хабарламаны «терезе процедурасына» жібереді. («Терезе процедурасы» - бұл қайта телефон соғу рәсім, ол тіркелген кезде терезе сыныбымен байланысты болды.) (Бір терезе бір терезені бірнеше терезеден пайдалана алады.)

Сондай-ақ, код терезе процедурасына хабарлама жібере алады. Бұлар хабарламасыз хабарламалар деп аталады.

Қатаң хабарлама циклі - бұл жалғыз нұсқа емес. Бағдарламаның басқа жерлеріндегі код хабарламаларды қабылдап, жібере алады. PeekMessage бұл тосқауыл қойылмайтын қоңырау, ол дереу қайтарылады, егер бар болса күтуде, немесе күтпегенде хабарлама жоқ. Күту хабарламасы хабарлама кезекте тұрғанша жіптің ұйықтауына мүмкіндік береді.

Қазіргі графикалық интерфейс шеңберлер, сияқты Windows Forms, Windows презентация қоры, MFC, Delphi, Qt, және басқалары Windows хабарламаларының циклін кодтауды қосымшаларды қажет етпейді, өйткені олар пернелерді басу және тышқанды шерту сияқты оқиғаларды шеңберде анықталған сәйкес өңдеушілерге автоматты түрде бағыттайды. Алайда, әрбір фреймберг хабарлама циклын бір жерде жүзеге асырады, ал хабарлама циклына көбінесе тікелей басқару қажет болған кезде қол жеткізуге немесе ауыстыруға болады.

Сондай-ақ қараңыз

Сыртқы сілтемелер