Bir programın yanıt vermediğini Windows nasıl biliyor? Çalışan tüm uygulamaları sürekli oylamaya devam ediyor mu?
Bir programın yanıt vermediğini Windows nasıl biliyor? Çalışan tüm uygulamaları sürekli oylamaya devam ediyor mu?
Yanıtlar:
Bir uygulama olayları Windows tarafından sağlanan bir sıradan alır.
Uygulama, olayı bir süre (5 saniye) sorgulamıyorsa, örneğin uzun bir hesaplama yaparken, Windows uygulamanın askıda kaldığını ve kullanıcıyı uyardığını varsayar.
Bu uygulamalardan kaçınmak için, çalışanların iş parçacığına pahalı hesaplamalar yapması veya işlemeyi bölmesi ve sıranın düzenli olarak sorgulandığından emin olun.
GetMessage
(veya benzeri) ve DispatchMessage
.
IsHungAppWindow
başlangıç aşamasında bir programın çağrılması gerekmediğini doğru bir şekilde not ederek GetMessage
.
GetMessage
mu? Bu özellik, basit komut satırı uygulamalarının kuyruğu yoklamaları gerekmediği için askıya alınmadan çalışmasına olanak tanır.
Windows'a kaynak kodu olmadan dahili olarak ne yaptığını bilemeyiz.
Kullanılabilecek bir SDK Windows işlevi IsHungAppWindow
var.
Bir uygulama giriş beklemiyorsa, başlatma işleminde değilse ve 5 saniyenin iç zaman aşımı süresi içinde PeekMessage'ı aramamışsa yanıt vermiyor olarak kabul edilir .
Kaynak IsHungAppWindow işlevi
Bir üst düzey pencere mesajlara birkaç saniyeden uzun süre cevap vermezse, sistem pencerenin cevap vermediğini düşünür. Bu durumda, sistem pencereyi gizler ve aynı Z sırasına, konumuna, boyutuna ve görsel niteliklere sahip olan bir hayalet pencere ile değiştirir. Bu, kullanıcının onu taşımasını, yeniden boyutlandırmasını ve hatta uygulamayı kapatmasını sağlar. Ancak, bunlar uygulama aslında yanıt vermediğinden mevcut olan tek eylemlerdir.
Mesajlar ve Mesaj Sıraları Hakkında Kaynak
Hayır. Başvurular sorgulanmaz, işlemci zamanı verilir.
Windows, uygulama iş parçacıklarına işlemci zamanı sağlayan bir zamanlama sistemine sahiptir.
Zamanlama algoritması karmaşıktır ve tam olarak tarif edilmektedir Windows iç, Bölüm 1 (6 Baskı) (Geliştirici Referans) .
PeekMessage
. Bu nedenle, Windows uygulamaya bir mesaj gönderdiğinde ve beş saniye içinde sinyal alamadığında, uygulamayı yanıt vermiyor olarak işaretler. Aslında, daha yeni Windows'larda, pencere yalnızca zaman içinde kullanıcı girdisine yanıt veremediğinde "bir yanıt vermiyor" olarak işaretlenir - bir tuşa veya bir tuşa basmaya veya basmaya çalışıncaya kadar, uygulama kolayca "askıda kalabilir" kalabilir yanıt vermeyen "görünme" olmadan dakikalar.
Aslında, Windows her zaman bir uygulamanın yanıt vermediğini bilmez. Uygulamanın, pencereli etkileşimli bir uygulama olması ve Windows uygulamanın yanıt vermediği sonucuna varmadan önce, pencerenin uygulamanın işleyemediği mesajları alması gerekir.
Örneğin, Windows'un komut satırından çalıştırılan kullanıcı arabirimine sahip olmayan sayıdaki bir uygulamanın bir şey yapıp yapmadığını veya belki de sonsuz bir döngüye takılıp takılmadığını bilmenin bir yolu yoktur.
Windows'taki etkileşimli grafik uygulamaları sürekli olarak bir ileti sırasını sorgulayarak olaylar alır. Windows bu ileti sırasını klavye, fare, zamanlayıcı vb. Olaylarla doldurur. Bir uygulama mesaj kuyruğunu bir süre boyunca sorgulayamazsa (5 saniye IsHungAppWindow () işlev belgesinde belirtilen zaman aşımı süresidir), Windows, pencere başlığını değiştirerek (metin ekleyerek "gösterebileceği" asılı "uygulamasını dikkate alır. (Yanıt vermiyor) "veya yerelleştirilmiş sürümlerde eşdeğer metin)" ve kullanıcı pencereyle etkileşime girmeye çalışırsa pencerenin içeriğini grileştirir.
Uygulamalar, Windows'un tanımadığı şekillerde askıda kalabilir. Örneğin, bir uygulama, mesaj kuyruğundaki mesajları kendileri için uygun şekilde hareket etmeden sorgulamaya devam edebilir, bu nedenle tüm pratik amaç ve amaçlar için Windows yanıt vermeyeceğini kabul etmeden "asılı" görünecektir.
Windows bir işletim sistemidir, çalışan tüm programları denetlemektedir.
Windows, olayları kullanarak pencere tabanlı uygulamalarla iletişim kurar. Her program, gelen olayları sürekli dinleyen ve işleyen bir iş parçacığına sahiptir. Örneğin, bir düğmeye veya bildirim alanı simgesine tıkladığınızda, Windows bir etkinlik oluşturur ve uygun işleme besler. İşlem daha sonra nasıl idare edileceğine karar verebilir.
Programlarla olan tüm etkileşimler Windows'da olaya dayalıdır, bu nedenle program gelen olayları çok uzun süre işlemezse, yanıt vermez. @DavidPostill bulundu ve içinde belirttiği gibi onun cevabını , zaman aşımı 5 saniyedir. PeekMessage
olay sırasından olay alan işlevdir.
Sorunuzun cevabı evet / HAYIR.
Windows İşletim Sistemi, Windows Messaging Queue'daki olaylarla uygulamaları sorgulayabilir ve yaparken, programlar WinAPI'ye bağlanmak veya Windows Queue'yu işlemek / yanıtlamak için kesinlikle sıfır bir zorunluluktur. Kuyruktaki bir mesajı yanıtlamak bile, programın "kilitlenmiş" olup olmadığını Windows'a bildirmez. Bu bir gösterge, ama hepsi bu. Gerçek cevap biraz daha karmaşık.
Gerçek cevap
İnsanlar burada asıl cevabın etrafında korunuyorlar. Bir programın “cevap vermiyor” olup olmadığını belirlemek , bilgisayar bilimlerinde resmen kararsız olan “ durma problemi ” nin bir çeşididir . Kısa açıklama, işlemcinin, bir alt rutinin sonsuz bir döngüde sıkışıp kalmayacağını tespit ederek kendisini sabitleyen, normal bir sayıyla sonlanacak bir sayacı arttırmak yerine hiçbir şey yapmadığını belirleyen üçüncü bir taraf olarak hareket edemeyeceğidir. Bunların her ikisinin de sıkıca kapatılmış halkalar olduğu düşünülebilir. Biri durur, diğeri asla sonlandırılmaz. Siz bile, bir kişi olarak, bir programın gerçekten yanıt verip vermediğini bilmiyorsunuz, özellikle de sıkıca kapalı bir döngüdeyseniz - sadece düşünmesi gerekip gerekmediğini bilirsiniz (cevap vermeli ).
Windows açısından bakıldığında, bu döngüler her ikisi de "yanıt vermiyor" . Bu yüzden pencereler size beklemede veya sonlandırmada seçenek sunar, çünkü söyleyemez.
"Pencereleri süreç olduğunu biliyor yüzden sonuç olduğunu edilir yanıt?" Cevap oldukça zekice. Bir işlem çok dişli ve çok işlemcili bir işletim sisteminde, bazen sıkıca kapalı döngülerde bile derlendiğinde, derleyici , işlemciye diğer çalışan işlemlere geçebileceğine dair uygun bir bildirim sağlayan bir verim () komutunu ekleyebilir. . O (Windows dahil) süreç izlemesini içerir bazıları yığınında diğer olayları, cevap işlemci ve (denir gibi) bir "bağlam anahtarı" olduğunu OS verir olur "vazgeçmez" gelmiştir yanıt verdi.
** Bu, yanıt veren bir sürecin sona ereceği anlamına gelmez . ** Sonsuz bir döngü içindeki bir işlem, işlemciyi sağlayabilir ve Windows'un diğer olayları işlemesine izin verir.
Bazı Windows programlarında, program, işletim sistemine "yanıt verdiğini" söyleyebilecek olan Windows işletim sistemi sinyallerini işleyecektir, ancak hiçbir programın bunu yapma zorunluluğu yoktur. Perl, php, python ve Windows gibi Windows'ta daha yüksek seviyedeki dillerde bile oldukça basit CPU hogging, sonlandırmayan programlar yazabilirsiniz, Windows sonlandırma ve yanıt vermediğini tespit edemeyebilir. Bu noktada, Windows sezgiselliğe bağlıdır - CPU yükü, bellek, program "tahmin etmek" çalışırken işlemcinin ne kadarını keseceği. Yine, bu noktada, Windows sizden feshetmenizi rica ediyor, çünkü gerçekten gerekip gerekmediğini bilmiyor.
Ayrıca Viktor'un (doğru) cevabına bakınız. "Yanıtlamama" nın sonsuz bir döngü ile aynı olup olmadığı hakkındaki yorumları görmezden gelin. Windows mesaj kuyruğunu bildirmeden bir uygulamanın idare edip edemeyeceği her türlü mesaj, kesinti, döngü vardır. İleti kuyruğunu kullanmak, bir işlemin askıda bırakılıp bırakılmadığını tahmin etmeyi denemek için işletim sisteminin sayaçları üzerinde tuttuğu birçok olaydan yalnızca biridir .