2016-04-14 52 views
0

SendMessage & PostMessage'u aradığımızda, mesajın çağrılan Send/PostMessage ile aynı sırada işleneceğini farz ediyorum. Ancak, document'un geçerli satırın doğru olması durumunda SendMessage'un işlevi yürüteceği gibi. Belirtilen pencere çağıran evre tarafından yaratıldıWindows ileti sırası, iletiyi bir FIFO biçiminde mi işlem yapıyor?

varsa, pencere yordamı, bir alt rutin olarak derhal denir. Yani şu durumda

:

PostMessage(currentThreadWindow, postMsg, ...) // line 1 
SendMessage(currentThreadWindow, sendMsg...) // line 2 

sendMsgpostMsg önce ele alınacaktır.

Mesaj SendMessage'a iletiliyor ve PostMessage siparişi saklıyor mu? Yani mesaj SendMessage ve PostMessage geçirilen gelmez

+0

Siparişin korunmadığı bir örnek verdiniz. Sorunun ne olduğundan emin değilsin. –

+0

@Raymond Chen, Peki, mesajın işlenmesiyle ilgili herhangi bir detay yorumu var mı? Siparişe bağlı olarak çok mantıklıyız. Örneğin, poster hedef parçanın kendisi değilse, sipariş tutulur. – ZijingWu

+0

Eğer iş parçacığı geçiş yapıyorsanız, daha az garanti alabilirsiniz. Örneğinizin mesajları her iki sırada da alınabilir. Aldığınız tek garanti, mesaj sırasındaki daha yüksek öncelikli mesajlar yoksa düşük öncelikli mesajların gönderileceğidir. – IInspectable

cevap

3

düzeni sağlamak?

Eğer çağıran evre tarafından sahip olunan bir pencereye bir mesaj yayınlayarak/gönderiyorsanız, zaten bu sorunun cevabını bilmek

: böylece, SendMessage çağrısı tamamen ileti sırası atlar ve hemen pencere yordamı çağırır Bu mesaj her zaman bir mesaj gönderilmeden önce ele alınacaktır.

İplik sınırlarını geçiyorsanız, artık herhangi bir garanti alamazsınız. İleti kuyruğunda bulunan tüm iletilerden önce gelen çapraz iş parçacıkları iletileri gönderilse de, çağıran iş parçacığının ne zaman tekrarlanacağını denetleyemezsiniz. PostMessage ve SendMessage numaralı telefon çağrıları arasına önceden girilirse, gönderilen mesajın gönderilen iletiden önce ele alınması muhtemeldir. Çağıran iş parçacığı bu aramalar arasında engellenmezse, yine de hiçbir garanti alamazsınız. Gönderilen veya gönderilen iletinin ilk önce işlenip işlenmediği, eşzamanlı olarak yürüten iş parçacığının yürütülmesine bağlıdır.

İşleri daha da karmaşık hale getirmek için bir iş parçacığı diğer zamanlarda da ileti alabilir (bkz. When can a thread receive window messages?). Bir outLink SendMessage topluluğunun sonucunu beklerken, bir iş parçacığı hala ilişkili çapraz iş parçacığı iletilerini alır. Başka bir deyişle: Bir sonraki mesaja geçmeden önce mesajların bir bütün olarak ele alındığı gerçeğine bile güvenemezsiniz. Pencere prosedürünüz yeniden giriş için hazırlanmalıdır.

Neye güvenebileceğiniz, gönderilen birçok iletinin göreli sırasının korunduğudur. Eğer 2 mesaj gönderirseniz, bu mesajlardan ilki ikinci mesajdan önce ele alınır. Bu mesajlar, diğer yayınlanan iletilerle de serpiştirilebilir.