Bir programın yanıt vermediğini Windows nasıl biliyor?


174

Bir programın yanıt vermediğini Windows nasıl biliyor? Çalışan tüm uygulamaları sürekli oylamaya devam ediyor mu?



@ magicandre1981 Bu sayfa, bir programın aktif olarak bir şey yaptığını kontrol etmenin bir yolunu sunar, ancak Windows'un gerçekte kullandığı yöntem değildir.
Kevin Panko

Windows ileti sırasına bakın, bir aday PeekMessage () işlevidir
Luciano

Yanıtlar:


150

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.


27
↑ Bu. Düzenli olarak çağrı sadece olsun, kabul edilen yanıt önerildiği üzere hiçbir planlama veya böyle bir ilgisi GetMessage(veya benzeri) ve DispatchMessage.
Damon,

1
Kabul edilen cevap, IsHungAppWindowbaşlangıç ​​aşamasında bir programın çağrılması gerekmediğini doğru bir şekilde not ederek GetMessage.
MSalters

@ MSKALTERLER Başlangıçta ilkinden önceki saat olarak tanımlanıyor GetMessagemu? 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.
cırcır ucube

4
@ ratchetfreak: Muhtemelen ilk CreateWindow çağrısından önce. Komut satırı uygulamaları tamamen farklı canavarlardır; ConHost.EXE içinde çalışıyorlar ve onlar için Windows GUI susbystem ile etkileşime giriyorlar.
MSalters

1
Ayrıca, Windows 7'de (ve muhtemelen daha erken), pencereyi bir şekilde manipüle etmeye kalkarsanız, pencerelerin bu kadar erken fark edeceğini gösteriyor. Bir program en üst düzeye çıkar veya taşıma mesajı işlemek etmezse gibi Windows 7 doğru yaklaşık 1 veya 2 saniye sonra yanıt vermiyor atlayacaktır ..
Dave Cousineau

78

Bir programın yanıt vermediğini Windows nasıl biliyor?

Windows'a kaynak kodu olmadan dahili olarak ne yaptığını bilemeyiz.

Kullanılabilecek bir SDK Windows işlevi IsHungAppWindowvar.

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


Çalışan tüm uygulamaları sürekli oylamaya devam ediyor mu?

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) .


2
Asılma durumu CPU'ya dayanmamaktadır. Çoğu program bu anlamda zamanın% 99,999'una "kapatılır" ve hiçbir şey yapmazlar.
usr

2
@ usr Nerede "asılı" nın CPU'ya bağlı olduğunu söyledim?
DavidPostill

2
@ usr Cevabın ilk yarısı "Sürekli çalışan tüm uygulamaları yoklamaya devam ediyor mu?" İkinci yarı cevaplıyor "Windows bir programın yanıt vermeyeceğini nasıl bilebilir?" OP bir kerede iki soru sordu;)
DavidPostill

9
Gerçekten yoklama değil, değil mi? İnternalın daha çok beklediğiniz gibi olduğunu düşününce siz vitrinde aradığınızda sinyal veriliyor 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.
Luaan

2
Cevabınıza yardımcı olmadığından "Mesajlar ve Mesaj Sıraları Hakkında" üzerindeki her şeyi silebilirsiniz. Windows, bir uygulamanın yanıt vermeyi bıraktığını biliyor çünkü mesajları pompalamayı durduruyor. Uygulama, mesajlarını pompalamak yerine yoğun bir şeyler yapmakla birlikte çalışıyor olabilir (ancak bu kötü tasarlanmış bir programdır).
Andy,

32

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.


8
Cevap vermemek, tanım gereği, pencere iletilerini işlememek anlamına gelmez, bu nedenle hizmetler veya konsol uygulamaları için geçerli değildir ve bu nedenle Windows'un bir uygulamanın yanıt vermediğini her zaman bildiğini söyleyebilirim. Ölü kilitleri karıştırıyorsunuz ve cevap vermiyorsunuz.
Andy,

Elbette bir programın cevap verip vermediğini bilebilir. "Yanıt vermiyor", "sonsuz bir döngüde sıkışmış" ile aynı değil
BlueRaja - Danny Pflughoeft

1
Aslında, bir uygulama GetMessage () aracılığıyla mesajlar alabilir ve bunları işleyemez ve kullanıcı tarafından kesinlikle yanıt vermemesine rağmen Windows tarafından "yanıt vermiyor" olarak tanınmaz. "Yanıt vermemek" terimi ayrıca genellikle ağ, servis, etkileşimli komut satırı vb. Uygulamalarını tanımlamak için kullanılır; AFAIK, ifadeyi pencereli uygulamalarla sınırlayan resmi bir tanım yoktur. Hem bir kilitlenme hem de sonsuz bir döngü (veya başka bir programlama hatası), bir uygulamanın yanıt vermemesine neden olabilir, ancak hayır, neden ve sonucun kafasını karıştırmadım.
Viktor Toth,

10

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. PeekMessageolay sırasından olay alan işlevdir.


0

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 .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.