Microsoft Windows'ta mesaj döngüsü - Message loop in Microsoft Windows

mesaj döngüsü zorunlu bir bölümüdür kodu her birinde program kullanan grafiksel kullanıcı arayüzü altında Microsoft Windows.qWindows programları GUI vardır olay odaklı. Windows bir kişiyi korur mesaj kuyruğu bir pencere oluşturan her iş parçacığı için. Genellikle yalnızca ilk iş parçacığı pencereler oluşturur. Windows yerleri mesajlar o iş parçacığının penceresinde fare etkinliği gerçekleştiğinde, o pencerede odak varken klavye etkinliği gerçekleştiğinde ve diğer zamanlarda bu kuyruğa. Bir işlem ayrıca iletileri kendi kuyruğuna da ekleyebilir. Kullanıcı girdisini kabul etmek için ve diğer nedenlerle, pencereli her iş parçacığı iletileri sırasından sürekli olarak almalı ve bunlara göre hareket etmelidir. Bir programcı, sürecin bunu yapmasını sağlamak için bir döngü GetMessage'ı çağıran (bir mesajı bloke eden ve onu alan) ve ardından DispatchMessage'ı (mesajı gönderen) çağıran ve süresiz olarak tekrarlayan. Bu mesaj döngüsüdür. Genellikle bir mesaj döngüsü vardır. ana program ana üzerinde çalışan Konu ve oluşturulan her kalıcı iletişim kutusunda ek mesaj döngüsü. İçin mesajlar her işlem penceresi kendi mesaj kuyruğundan geçer ve kendi mesaj döngüsü tarafından işlenir. Bir mesaj döngüsü, bir tür olay döngüsü.

Aşağıdaki gibi temel bir mesaj döngüsü görünür:

int WINAPI WinMain(HİNSTANS hInstance, HİNSTANS hPrevInstance, LPSTR lpCmdLine, int nCmdShow){    MSG msg;    BOOL bRet;    süre (1)    {        bRet = GetMessage(&msg, BOŞ, 0, 0);        Eğer (bRet > 0)  // (bRet> 0, işlenmesi gereken bir mesajı belirtir.)        {            TranslateMessage(&msg);            DispatchMessage(&msg);        }        Başka Eğer (bRet < 0)  // (bRet == -1 bir hatayı belirtir.)        {            // Hatayı işleyin veya günlüğe kaydedin; muhtemelen çıkış.            // ...        }        Başka  // (bRet == 0 "programdan çık" anlamına gelir.)        {            kırmak;        }    }    dönüş msg.wParam;}

Olay döngüsünün çağırması gelenekseldir TranslateMessage her mesajda, sanal tuş vuruşlarını Teller. Aranıyor TranslateMessage teknik olarak gerekli değildir, ancak aranmazsa sorunlar ortaya çıkabilir. Mesaj döngüsü çağırmalıdır DispatchMessage.

Mesaj döngüsü, işlediği mesajlara doğrudan etki etmez. Onları arayarak gönderir DispatchMessage, mesajı mesajın adreslendiği pencere için "pencere prosedürüne" aktarır. ("Pencere prosedürü" bir geri çağırmak yordamı, kaydedildiğinde pencere sınıfı ile ilişkilendirilmiştir.) (Birden fazla pencere aynı pencere prosedürünü kullanabilir.)

Kod ayrıca mesajları doğrudan bir pencere prosedürüne gönderebilir. Bunlara sıralanmamış mesajlar denir.

Sıkı bir mesaj döngüsü tek seçenek değildir. Programın başka bir yerindeki kod da mesajları kabul edebilir ve gönderebilir. PeekMessage Bekleyen herhangi bir mesaj varsa veya bekleyen hiçbir mesaj yoksa hemen dönen, engellemeyen bir aramadır. WaitMessage sıraya bir ileti gelene kadar iş parçacığının uyumasına izin verir.

Modern grafik arayüz çerçeveler, gibi Windows Formları, Windows Presentation Foundation, MFC, Delphi, Qt ve diğerleri, uygulamaların bir Windows mesaj döngüsünü kodlamasını gerektirmez, çünkü bunlar, tuşlara basma ve fare tıklamaları gibi olayları, çerçeve içinde tanımlanan uygun işleyicilerine otomatik olarak yönlendirir. Bununla birlikte, her çerçeve bir yerde bir mesaj döngüsü uygular ve mesaj döngüsüne genellikle daha doğrudan kontrol gerektiğinde erişilebilir veya değiştirilebilir.

Ayrıca bakınız

Dış bağlantılar