Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Code, der das Programm einfrieren lässt (https://www.delphipraxis.net/213705-code-der-das-programm-einfrieren-laesst.html)

Alallart 12. Sep 2023 14:14

Code, der das Programm einfrieren lässt
 
Ich suche ein Stück Code, mit dem ich mein Programm dazu bringen kann auf nichts zu reagieren, so dass er über den Taskmanager beendet werden muss. Mir fällt leider nichts gutes ein.

Grund für den Code ist, dass ich gelegentlich PC Kurse gebe, bzw. Umgang mit Windows. Dazu gehört es ein Programm mit dem Taskmanager zu schließen. In der Regel sage ich: "stellen Sie sich vor, das Programm reagiert nicht."

Besser wäre es ihnen ein Programm geben, das tatsächlich nicht mehr reagiert, und wo im Tasmanager auch die Meldung "Programm reagiert nicht" steht. Und damit habe ich ein Problem. Was ich nicht will ist, dass Windows oder andere Programme beeinträchtigt werden. Nur das eine Programm soll auf nichts mehr reagieren, außer den Taskmanager.

Fällt einem was ein?

MEissing 12. Sep 2023 14:21

AW: Code, der das Programm einfrieren lässt
 
repeat until false;

Delphi.Narium 12. Sep 2023 14:23

AW: Code, der das Programm einfrieren lässt
 
Delphi-Quellcode:
repeat until true = false;
Delphi-Quellcode:
while true do;
Delphi-Quellcode:
repeat until 47 = 11;
Delphi-Quellcode:
i := 0; repeat until i = 42;
Eigentlich jede Schleife, deren Endebedingung nie erfüllt werden wird.

Uwe Raabe 12. Sep 2023 15:20

AW: Code, der das Programm einfrieren lässt
 
Delphi-Quellcode:
Sleep(MaxInt);
Dauert gut 3 Wochen bis das zurückkommt.

Sinspin 13. Sep 2023 07:08

AW: Code, der das Programm einfrieren lässt
 
Zitat:

Zitat von MEissing (Beitrag 1526803)
repeat until false;

Zitat:

Zitat von Delphi.Narium (Beitrag 1526804)
Delphi-Quellcode:
repeat until true = false;
Delphi-Quellcode:
while true do;
Delphi-Quellcode:
repeat until 47 = 11;
Delphi-Quellcode:
i := 0; repeat until i = 42;
Eigentlich jede Schleife, deren Endebedingung nie erfüllt werden wird.


Früher hat man diese Methode gerne mal verwendet um zu Heizen.
Seit Strom aber so teuer ist dass die Leute wieder Schweinespeck in Tranlampen übergehen, kann ich nur zu Uwe's Lösung raten.
Zitat:

Zitat von Uwe Raabe (Beitrag 1526808)
Delphi-Quellcode:
Sleep(MaxInt);
Dauert gut 3 Wochen bis das zurückkommt.


Kas Ob. 13. Sep 2023 07:34

AW: Code, der das Programm einfrieren lässt
 
Use timer (or don't) and wait on Named Event, trigger the state by another process to make the waiting process simulate a freeze (hanging/not responding) and get out of it (resume normally), just make sure you that main thread is the one waiting on the event.

Der schöne Günther 13. Sep 2023 07:59

AW: Code, der das Programm einfrieren lässt
 
Bei Interesse hier noch etwas Lesestoff was Windows dazu bringt, ein Programm als "(reagiert nicht)" zu behandeln:

https://learn.microsoft.com/en-us/wi...s-applications

dummzeuch 13. Sep 2023 07:59

AW: Code, der das Programm einfrieren lässt
 
Oder der Klassiker:

Delphi-Quellcode:
const
  HELL_FREEZES_OVER = False;

repeat
until HELL_FREEZES_OVER;

Delphi.Narium 13. Sep 2023 08:43

AW: Code, der das Programm einfrieren lässt
 
Zitat:

Zitat von Sinspin (Beitrag 1526820)
Zitat:

Zitat von MEissing (Beitrag 1526803)
repeat until false;

Zitat:

Zitat von Delphi.Narium (Beitrag 1526804)
Delphi-Quellcode:
repeat until true = false;
Delphi-Quellcode:
while true do;
Delphi-Quellcode:
repeat until 47 = 11;
Delphi-Quellcode:
i := 0; repeat until i = 42;
Eigentlich jede Schleife, deren Endebedingung nie erfüllt werden wird.


Früher hat man diese Methode gerne mal verwendet um zu Heizen.
Seit Strom aber so teuer ist dass die Leute wieder Schweinespeck in Tranlampen übergehen, kann ich nur zu Uwe's Lösung raten.
Zitat:

Zitat von Uwe Raabe (Beitrag 1526808)
Delphi-Quellcode:
Sleep(MaxInt);
Dauert gut 3 Wochen bis das zurückkommt.


Prinzipiel hast Du ja recht. Es war halt nach dem "Programmhänger" gefragt und nicht nach einem Strom- und / oder resourcesparenden "Programmhänger".

Wir können aber gerne die Lösungsvorschläge kombinieren, dann wird der "Programmhänger" auch strom- und resourcensparend:

Delphi-Quellcode:
repeat Sleep(MaxInt); until false;

Delphi-Quellcode:
repeat Sleep(MaxInt); until true = false;

Delphi-Quellcode:
while true do Sleep(MaxInt);

Delphi-Quellcode:
repeat Sleep(MaxInt); until 47 = 11;

Delphi-Quellcode:
i := 0; repeat Sleep(MaxInt); until i = 42;


Die Einschränkung der Laufzeit auf lediglich etwa drei Wochen, aus Uwes Vorschlag, wird dadurch auch aufgehoben. ;-)

Es handelt sich also um durchaus unterschiedliche Lösungen des Problems ;-)

himitsu 13. Sep 2023 09:24

AW: Code, der das Programm einfrieren lässt
 
Kommt auch drauf an, was man will.

Schleifen ohne Sleep halten an und lasten CPU einen Kern hoffentlich voll aus.
Mit einem Sleep oder WaitFor würde auch angehalten, aber der Thread/Kern arbeitet mit 0%.

Standardmäßig steht das HungApp-Timeout bei 3 Sekunden.
Also nach einem Hängen von 3 Sekuunden, würde Windows das Fenster als "reagiert nicht" markieren.
Allerdings nicht sofort, aber wenn man z.B. die Maus drüber hinweg bewegt, dann wird es ganz schnell registriert.
PS: In Wirklichkeint ersetzt/erweitert Windows nicht die Form-Caption, sondern macht einen Screenshot vom Fenster, blendet das Fenster aus und stellt ein Ersatzfenster dar, mit den Scrrenshot als Hintergrund und der neuen Caption (darum zuckt das auch so "brutal", wenn das Fenster wieder reagiert und wieder ausgetauscht / neu aufgebaut wird)


Also, ein
Delphi-Quellcode:
while True do begin Sleep(15 {bis 30} * MSecsPerSec); Application.ProcessMessages; end;
, bzw. ein Timer mit Interval=1 und darin das Sleep, würde bereits ein schönes Hängen simulieren, wo es aber nicht permanent hängt.
OK, die Pause vielleicht doch besser anpassen, falls jemand das Setting geändert hat (HKEY_CURRENT_USER\Control Panel\Desktop : HungAppTimeout)


PS: Was auch nett ist, wäre vielleicht ein Stackoverflow, oder Ähnliches, wobei das Programm ohne Rückmeldung verreckt und wortlos verschwindet,
damit man es in der Ereignisanzeige nach dem Fehler suchen darf. (ein Eintrag unterm Programmnamen, aber vor allem der Eintrag vom WER / Windows Error Reporting)


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:12 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz