Warum kann edit.com erfolgreich beendet werden, indem Sie auf Datei → Beenden klicken, aber nicht auf die Schaltfläche zum Schließen ☒? Warum bewirkt der Schließen-Button, dass eine Aufforderung zum Abbruch kommt?
TL; DR
Da Edit ein DOS-Programm ist, hat File → Exit nichts mit Windows oder der ☒
Schaltfläche zu tun .
Subsysteme
Windows verfügt über zwei primäre Subsysteme ("Frameworks", wenn Sie so wollen), mit deren Hilfe ein Programm die Dinge vereinfachen kann und der Programmierer vermeiden muss, alles manuell auszuführen und das Rad neu zu erfinden. Es gibt das Standard-Windows-Subsystem und das Konsolensubsystem .
Windows-Programme sind GUI-Programme (grafische Benutzeroberfläche), während Konsolenprogramme CLI-Programme (Command Line Interface) sind. Dies sind sehr unterschiedliche Designs und was für den einen funktioniert, funktioniert für den anderen nicht.
Windows-Subsystem
Das Windows-Subsystem ist das gebräuchlichste, und Programme mit grafischen Fenstern und Steuerelementen verwenden dies. Das "Herz" des Programms ist eine Windows-Meldungsschleife . Nachdem das Programm initialisiert und betriebsbereit ist, tritt es in eine Endlosschleife ein, in der es sich im Leerlauf befindet und geduldig darauf wartet, dass etwas passiert. Dies kann vom Benutzer eingegebene Eingaben, ein Zeitgeber, Netzwerkaktivität usw. umfassen. Wenn Windows Änderungen feststellt, auf die das Programm reagieren muss oder kann, werden dem Programm eine Nachricht gesendet . Wenn es sich in der Nachricht um etwas handelt, für das das Programm ein Interesse hat, antwortet es darauf mit einem Handler, der nur eine Funktion ist, die etwas tut.
(So funktionieren auch die meisten Spiele. Sie werden eine Hauptspielschleife haben , die auf Eingaben von Gamepad-Schaltflächen, Timern usw. wartet, sie aktualisiert dann die Spielwelt, rendert ein Bild, gibt es auf dem Bildschirm aus und beginnt von vorne .)
Hung-Programme
Normalerweise, wenn ein Programm eine Nachricht erhält, wird es diese entweder bearbeiten oder weiterleiten. Dies geschieht normalerweise schnell. Manchmal kann ein Programm jedoch aus irgendeinem Grund hängen bleiben, was dazu führt, dass es keine Meldungen verarbeitet. Windows kann erkennen, wann dies geschieht, und wenn es zu lange dauert, wird das Programm als eingefroren betrachtet und bietet an, dass der Benutzer das nicht reagierende Programm beendet, anstatt dass es ordnungsgemäß heruntergefahren wird. Dies bedeutet, dass das Programm abrupt endet und nicht nur nicht gespeicherte Dateien verloren geht, sondern dass offene Dateien möglicherweise in einem inkonsistenten Zustand verbleiben, wodurch sie beschädigt werden.
Konsolen-Subsystem
Konsolenprogramme unterscheiden sich von grafischen Windows-Programmen. Sie haben sich aus ihren DOS-Vorfahren entwickelt, und obwohl sie durch die Windows-Eingabeaufforderung eine Menge neuer Funktionen gewonnen haben, funktionieren sie wie alte DOS-Programme, einschließlich des Startens, Laufens und Herunterfahrens.
Programm schließen
Lassen Sie uns untersuchen, was passiert, wenn Sie auf die ☒
Schaltfläche für beide Arten von Programmen klicken .
Ein Windows-Programm schließen
Wenn Sie auf die ☒
Schaltfläche eines Windows-Programms klicken, sendet Windows diesem Programm eine WM_CLOSE
Nachricht. Die Programmschleife erkennt die Nachricht und antwortet durch Aufrufen einer Funktion, die die Standardroutine zum Beenden eines Windows-Programms durchläuft (hoffentlich nach einigen Bereinigungsarbeiten wie dem Freigeben zugewiesener Ressourcen, dem Speichern von Dateien usw.). Abgesehen von den Bereinigungsarbeiten erfolgt das eigentliche Herunterfahren des Routings ziemlich schnell, und Windows geht zur nächsten Aufgabe über.
Konsolenprogramm schließen
Wenn Sie auf die ☒
Schaltfläche der Eingabeaufforderung klicken, teilen Sie der Eingabeaufforderung mit, dass sie geschlossen werden soll. Wenn es diese Nachricht erhält, versucht es zu schließen, und wenn Sie an der Eingabeaufforderung untätig sitzen, kann es dies ohne viel Zögern tun. Was passiert aber, wenn in der Eingabeaufforderung ein Programm geöffnet und ausgeführt wird? Dieses Programm ist insgesamt ein separater Prozess. Die Eingabeaufforderung kann das Programm nicht einfach beenden, das wäre nicht benutzerfreundlich und könnte Daten beschädigen oder nicht gespeicherte Dateien verlieren. Stattdessen wird versucht, die Schließmeldung an das Programm zu übergeben. Es gibt zwei Szenarien, die sich an dieser Stelle abspielen können:
Wenn es sich bei dem Programm um ein Windows-Konsolenprogramm handelt, funktioniert das Senden der Close-Nachricht normalerweise sofort, da es mit dem Windows-Konsolensubsystem kompiliert wurde und Sie möglicherweise einige nicht gespeicherte Dateien verlieren, weil es Windows-spezifischen Konsolencode verwendet keine Verzögerung, und daher muss Windows nicht zum Töten greifen.
Wenn das Programm ein DOS-Programm (wie Edit) ist, wurde es jedoch so kompiliert, dass es unter DOS ausgeführt wird, und kennt daher nichts von Windows und reagiert daher nicht. Daher denkt Windows, dass es aufgehängt ist und bietet an, das Programm zu beenden.
Datei → Beenden
Bei einem Windows-Programm ist der Exit-Befehl (normalerweise File → Exit
) nur ein Alias für WM_CLOSE
. Wenn Sie das Programm beenden, wird die Schließmeldung so angezeigt, als hätten Sie auf die Schaltfläche Schließen geklickt.
Mit Edit hat der Exit-Befehl (auch File → Exit
) nichts mit Windows zu tun. Es ist eine integrierte Funktion dieses DOS-Programms. Wenn Sie auf die Schließen-Schaltfläche klicken, ist dies eine völlig andere Sache als das Beenden von Edit. Das Klicken ☒
sagt dem Programm also nicht das Schließen.
Unterschiedliche Ergebnisse
Aber warum erhält Kevin ein anderes Ergebnis als andere (und ich)? Dies ist wahrscheinlich auf einen Unterschied in der Zeitüberschreitung zurückzuführen, die Windows für seine Routinen konfiguriert hat, die erkennen, wann ein Programm eingefroren ist. Es gibt tatsächlich verschiedene Einstellungen, die dies beeinflussen. Wenn Sie die Einstellungen ändern, muss Windows mehr oder weniger warten, bevor das Dialogfeld angezeigt wird.
Ich wollte sie alle aufzulisten, aber während sie auf der Suche, ich am Ende der Suche nach einem Beitrag, dass ich eine Weile gemacht hatte, zurück, die bereits sie alle aufgelistet, so dass, wenn jemand in den Details interessiert ist, können Sie sie dort finden.