Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Laufende Programme unter Windows 7 - werden die unter- oder gar abgebrochen? (https://www.delphipraxis.net/169980-laufende-programme-unter-windows-7-werden-die-unter-oder-gar-abgebrochen.html)

Delphi-Laie 23. Aug 2012 19:19


Laufende Programme unter Windows 7 - werden die unter- oder gar abgebrochen?
 
Hallo Delphifreunde!

Unter Windows 7 (ggf. auch schon unter Vista?!) können anscheinend laufende Programme (also die wirklich laufen und nicht nur auf Eingabe warten), die nicht kommunizieren (jedenfalls ist kein Application.Processmessages meinerseits implementiert) von außen unter- und gar abgebrochen werden. Mit "abgebrochen" meine ich nicht, daß das Programm beendet wird, sondern daß die interne Beschäftigung mit sich selbst anscheinend zum Erliegen kommt (obwohl die Prozessorauslastung laut Taskmanager nicht zurückgeht).

Das tritt z.B. auf, wenn man das Formular verschieben möchte - das ist bis Windows XP bei diesen Bedingungen unmöglich, da eben das Application.Processmessages fehlt. Windows 7 erlaubt es dennoch. Es tritt dann ein hellblaues "Rödelrad" auf, aber auch dann, wenn man z.B. zu einem anderen Formulare wechselt oder z.B. der Bildschirmschoner startet und man zum Formular des Rechenprogrammes zurückkehrt. Das Programm scheint manchmal noch weiter zu werkeln, ich hatte jedenfalls in diesem Zustande auch schon das Ende der Berechnungen. Besonders kritisch wird es anscheinend, wenn das Formular eingetrübt, eingenebelt wird - dann wird die interne Berechnung von außen abgebrochen(?) und läßt sich auch von außen nicht fortsetzen, jedenfalls ist ein Ende der Berechnungen dann nicht in Sicht.

Das ganze passiert - natürlich - mit einem eigenen Delphi-Compilat, und zwar reproduzierbar. Der Rödelkreis fiel mir zwar schon vorher auf, die Tragweite dessen, was sich dahinter abpsielt, jedoch erst vorhin.

Ist das unter Windows 7 normal (sicherlich), und kann man das Windows evtl. abgewöhnen (Einstellung?), oder schafft man es irgendwie, den unterbrochenen Programmablauf von außen forsetzen zu lassen?

Vielen Dank im voraus!

Gruß Delph-Laie

jaenicke 23. Aug 2012 19:59

AW: Laufende Programme unter Windows 7 - werden die unter- oder gar abgbrochen?
 
Das Verhalten ist bis XP exakt genauso was den Ablauf im betroffenen Programm angeht. Da wird weder dort noch ab Vista etwas abgebrochen.

Der Unterschied ist nur, dass Windows ab Vista den letzten Fensterinhalt noch zwischengespeichert hat und deshalb nicht mehr einfach gar nicht mehr aktualisiert (der Schliereneffekt bei nicht reagierenden Fenstern bis XP), sondern einfach ausgraut.

Wenn das bei deinem Programm reproduzierbar passiert, fehlt da wohl ein Thread für eine Berechnung. :wink:

hathor 23. Aug 2012 20:18

AW: Laufende Programme unter Windows 7 - werden die unter- oder gar abgbrochen?
 
Bei WIN 7 gibt es

Darstellung und Leistung von WINDOWS anpassen
Leistungsoptionen -> Datenausführungsverhinderung

Da kannst Du Dein Programm anmelden.
Es wird dann von der Datenausführungsverhinderung ignoriert.

Besser wäre es, das Programm SAUBER zu programmieren!
Was ist, wenn ein Programm Standby, Hibernate oder Shutdown aufruft?
Dein "beschissenes" Programm reagiert nicht!
Sowas würde bei mir gleich von der Platte fliegen!

himitsu 23. Aug 2012 20:58

AW: Laufende Programme unter Windows 7 - werden die unter- oder gar abgbrochen?
 
In Windows 7 Laufen alle Fenster durch den Windows-Desktop-Manager, welcher für die Aero-typischen Darstellungen (diese milchige Transparenz und Co.) zuständig ist.
Wenn ein Programm/Fenster nicht mehr reagiert, dann wird ein screenshot davon gemacht, das Fenster auf dem Desktop ausgeblendet und stattdessen ein "Ersatzfenster" mit dem eingetrübten Foto angezeigt. (eingetrübt, damit man sieht, daß es hängt)

Das Ersatzfenster läßt sich nun verschieben, minimieren und Dergleichen, weil es nicht zum hängenden Prozess gehört, sonderm zum Desktopmanager.
Außerdem reagiert dieses Fenster auf den Schließenbutton oben rechts, wodurch dieses Programm dan abgeschossen wird, so als hätte man es über den Taskmanager beendet.
Das ist auch der Grund, warum bei häßlich geskinnten Programmen da urplötzlich die Windowstitelleiste auftaucht.



Also ich schließe mich an und rate zum ordentlichen Programmieren, wobei man also verhindert, daß das Programm hängen bleibt.

jfheins 23. Aug 2012 21:51

AW: Laufende Programme unter Windows 7 - werden die unter- oder gar abgbrochen?
 
Zitat:

Zitat von hathor (Beitrag 1179597)
Bei WIN 7 gibt es

Darstellung und Leistung von WINDOWS anpassen
Leistungsoptionen -> Datenausführungsverhinderung

Das hat (mal wieder) nichts mit der Fragestellung zu tun.

Zur eigentlichen Frage hilft vielleicht dieser Artikel in dem das Verhalten von Windows dokumentiert ist: http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx
(hat himi schon angeschnitten, aber der Artikel geht noch etwas ins Detail...)
MfG

Delphi-Laie 23. Aug 2012 22:50

AW: Laufende Programme unter Windows 7 - werden die unter- oder gar abgebrochen?
 
Danke für die Hinweise, vielleicht kann ich damit etwas bewerkstelligen.

Ich verbitte mir allerdings Verbalausfälle in bezug auf meine Programme/Programmierung. Application.Processmessages bläht den Code (sowohl Quell- als auch compilierten) auf und verlangsamt die Programmausführung, also die Ablaufgeschwindigkeit. Es hat also durchaus auch seine Berechtigung, das NICHT einzusetzen. Ein Programm sollte auch die Freiheit haben, ungestört werkeln zu dürfen. Daß neueres Windows damit nicht adäquat umgehen kann, ist in gewisser Weise Winzigweichs Schuld, denn Windows vorher machte auch nicht solche Anstalten darum. Auch wenn Windows das natürlich nicht unterschieden kann: Nicht jedes Programm, das die Kommunikation verweigert, "hängt" tatsächlich.

Sollte "hathor" sogar derselbe wie in der Entwickler-Ecke sein, wundert mich dieser sein "rauher Ton" (um es mal dezent auszudrücken) überhaupt nicht.

himitsu 23. Aug 2012 23:09

AW: Laufende Programme unter Windows 7 - werden die unter- oder gar abgbrochen?
 
Es verbietet dir keiner, daß dein Code ohne ProcessMessages stundenlang laufen darf.
Aber dafür gibt es Threads.

Visuelle Oberflächen und vorallem der Hauptthread dürfen aber nunmal nicht einfach so nicht mehr auf den Benutzer reagieren, also hat Windows nun etwas drin, was dem Benutzer vor sowas wenigstens etwas beschützt.

Fazit: Es liegt an deinem Programm und nicht an Windows.

Luckie 23. Aug 2012 23:14

AW: Laufende Programme unter Windows 7 - werden die unter- oder gar abgbrochen?
 
Wenn dein Programm nun mal nicht auf Nachrichten reagiert innerhalb von fünf Sekunden, dann geht Windows eben davon aus, dass es nicht mehr reagiert. Das kann eine Schleife sein, dass dein Programm nicht auf Windows nachrichten reagiert, das kann aber auch ein Funktionsaufruf sein, der nicht nach fünf Sekunden zurückkehrt. Und die Kritik an dein Programmkonzept scheint mir durchaus berechtigt. Aktionen, die länger dauern, lagert man nun mal in Threads aus, damit das Fenster eben noch reagiert. Und aufrufe von ProsessMessage blähen nicht das Programm auf. Dass es durchaus langsamer werden kann, wenn Nachrichten abgearbeitet werden müssen, ist hingegen richtig.

himitsu 23. Aug 2012 23:22

AW: Laufende Programme unter Windows 7 - werden die unter- oder gar abgbrochen?
 
Zitat:

Zitat von Luckie (Beitrag 1179638)
Dass es durchaus langsamer werden kann, wenn Nachrichten abgearbeitet werden müssen, ist hingegen richtig.

Wobei es ja extrem bremst, wenn man dieses paar millionen (hunderte) Mal die Sekunde aufruft.
Aber es sagt ja keiner, daß man es mehr als 10 Mal die Sekunde aufrufen muß.

Furtbichler 24. Aug 2012 08:03

AW: Laufende Programme unter Windows 7 - werden die unter- oder gar abgbrochen?
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1179633)
...Winzigweichs...

Ich kanns nicht mehr hören.:roll: Ja, Du hast in Englisch aufgepasst.

Delphi-Laie 24. Aug 2012 14:48

AW: Laufende Programme unter Windows 7 - werden die unter- oder gar abgebrochen?
 
Zitat:

Zitat von himitsu (Beitrag 1179637)
Fazit: Es liegt an deinem Programm und nicht an Windows.

Zitat:

Zitat von Delphi-Laie (Beitrag 1179633)
Daß neueres Windows damit nicht adäquat umgehen kann, ist in gewisser Weise Winzigweichs Schuld, denn Windows vorher machte auch nicht solche Anstalten darum.

Soviel zur "Schuldfrage".


Das interessiert mich nun doch näher: Mein Sortierkino läuft auch nur im VCL-(Haupt-)Thread, doch da macht Windows 7 - z.B. nach dem Start und darauffolgenden Abbruch des Bildschirmschoners - auch nicht solche Zicken mit dem hellblauen Rödelkreis. Warum, ist mir unklar. Mein weiter oben erwähntes Rechenprogramm gibt auch fortlaufend aus - allerdings nur in der Titelleiste des Formulares, weil die fortlaufend automatisch aktualisiert/aufgefrischt wird, nichts jedoch auf das Canvas wie das Animationsprogramm.

Puh, wenigstens dieses eine Mal Glück gehabt, denn an der graphikausgabeintensiven Sortieranimation auch mit einem zusätzlichen Thread (inkl. synchronize!) rumzumachen, verspüre ich keinen Antrieb.

Die Datenausführungsverhinderung für alle außer den explizit genannten oder nur für wichtige Windowsprogramme einzuschalten, klingt plausibel, funktioniert aber leider auch nicht: Die Berechnung wird dennoch gestoppt und der ge-/beliebte blaue Rödekreis erscheint erneut. Leider muß dazu der Computer bzw. Windows neu gestartet werden. Hat also MS/WW das dem Windows immer noch nicht komplett abgewöhnen können.

So, jetzt geht es an die Threadauslagerung der Berechnungen.

Danke noch einmal!

jaenicke 24. Aug 2012 15:33

AW: Laufende Programme unter Windows 7 - werden die unter- oder gar abgebrochen?
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1179633)
Daß neueres Windows damit nicht adäquat umgehen kann, ist in gewisser Weise Winzigweichs Schuld, denn Windows vorher machte auch nicht solche Anstalten darum.

Das stimmt schlicht nicht. Klicke unter XP einfach ein paarmal in ein solches nicht reagierendes Fenster, dann kannst du dort das Verhalten provozieren. Bei einer Firmeninstallation wird dann in der Regel direkt angeboten das Programm zu beenden, bei der Home Edition standardmäßig nur angezeigt, dass es nicht reagiert.

Der große Unterschied ist hauptsächlich, dass Windows den ursprünglichen Fensterinhalt unter XP nicht zwischengespeichert hatte und deshalb das Fenster schlicht gar nicht mehr aktualisiert hat. Deshalb sah es so aus als ob es noch reagiert. Aber das war schlicht falsch, da es ja dennoch sein konnte, dass es nicht mehr reagiert. Das Problem für den User war so, dass er nicht erkennen konnte, wenn ein Programm schon abgestürzt war, und so ggf. ewig gewartet hat, obwohl das Programm schon tot war.

Dass das Programm abgebrochen wird, passiert bei mir auch nicht, es sei denn ich klicke das als Benutzer an. Ansonsten läuft die Berechnung bei mir normal weiter und das Programm berappelt sich wieder sobald es den Vorgang beendet hat und die Anzeige wieder aktualisiert.

himitsu 24. Aug 2012 15:48

AW: Laufende Programme unter Windows 7 - werden die unter- oder gar abgebrochen?
 
Zitat:

Klicke unter XP einfach ein paarmal in ein solches nicht reagierendes Fenster, dann kannst du dort das Verhalten provozieren.
Auch sehr schön zu erkennen, wenn man mit einem anderem Fenster vor dem "hängenden" Fenster rumwedelt.

Delphi-Laie 24. Aug 2012 16:08

AW: Laufende Programme unter Windows 7 - werden die unter- oder gar abgebrochen?
 
Ist ja letztlich auch egal.

Ich begann, die Berechnungen in Threads auszulagern (jeweils immer nur einer), und da in diesen auf das Formular zurückgegriffen wird, sogar sauber mit synchronize. Funktioniert soweit auch, die Rechenergebnisse sind dieselben, der Taskmanager zeigt während der Berechnungen bei den Threads die Anzahl 2 an. Jedoch bin ich insofern ernüchtert, als daß das Formular während der Berechnungen leider nicht verschiebbar ist und auch nach "Darüberwischen" nicht neugezeichnet wird - sowohl unter Windows 2000 als auch (zunächst) unter Windows 7. Von Threads hatte ich eigentlich etwas mehr erwartet.

Anscheinend wird die Berechnung aber von außen doch nicht abgewürgt.

Edit: Das Auffrischen des Formulares während der Berechnungen funktioniert unter Windows 7 anscheinend doch, im Gegensatz zu Windows 2000.
Edit 2: Eher inkonsistent: Die Auffrischbarkeit des Formulares hängt vielleicht doch nicht davon ab, ob ein zusätzlicher Thread bereitgestellt wird.

Laßt es gut sein, danke noch einmal!

jfheins 24. Aug 2012 16:16

AW: Laufende Programme unter Windows 7 - werden die unter- oder gar abgebrochen?
 
Hi,
das klingt, als hättest du "zuviel synchronisiert" ... Bist du sicher dass die zeitaufwändige Berechnung im Thread passiert und nur kurz zur Anzeige synchronize() aufgerufen wird?

himitsu 24. Aug 2012 16:18

AW: Laufende Programme unter Windows 7 - werden die unter- oder gar abgebrochen?
 
Gut, die Threads müssen der GUI aber auch ein bissl Luft lassen.
Wenn sich ständig Threads mit der GUI synchronisieren und diese keine Zeit mehr für sich findet, dann bleibt sie natürlich auch hängen.

Wenn du was machen willst und es kommt jemand, der mit dir was machen möchte und noch ehe ihr fertig seid, steht schon der Nächste da und will auch was usw.,
dann hast du für deine Arbeit ja auch keine Zeit mehr.

Delphi-Laie 24. Aug 2012 16:18

AW: Laufende Programme unter Windows 7 - werden die unter- oder gar abgebrochen?
 
Zitat:

Zitat von jfheins (Beitrag 1179759)
Hi,
das klingt, als hättest du "zuviel synchronisiert" ... Bist du sicher dass die zeitaufwändige Berechnung im Thread passiert und nur kurz zur Anzeige synchronize() aufgerufen wird?

Nein, es läuft alles (d.h. die komplette Berechnung) in der Synchronize-Prozedur. Das ist wahrscheinlich falsch....

Delphi-Laie 24. Aug 2012 16:22

AW: Laufende Programme unter Windows 7 - werden die unter- oder gar abgebrochen?
 
Zitat:

Zitat von himitsu (Beitrag 1179760)
Gut, die Threads müssen der GUI aber auch ein bissl Luft lassen.
Wenn sich ständig Threads mit der GUI synchronisieren und diese keine Zeit mehr für sich findet, dann bleibt sie natürlich auch hängen.

Wenn du was machen willst und es kommt jemand, der mit dir was machen möchte und noch ehe ihr fertig seid, steht schon der Nächste da und will auch was usw.,
dann hast du für deine Arbeit ja auch keine Zeit mehr.

Ja, wird allmählich klar.

Man kann synchronize, soweit ich weiß, keine Parameter übergeben, was für die laufende Ausgabe von Zwischenrechenergebnissen wichtig wäre. Es wird also alles grauenhaft umständlich oder gar unmöglich....

Sind eigentlich auch schon nur lesende Zugriffe auf die VCL-Elemente bereits "synchronize-pflichtig"?

Delphi-Laie 24. Aug 2012 16:29

AW: Laufende Programme unter Windows 7 - werden die unter- oder gar abgebrochen?
 
Lässig: Ohne Synchronize klappt es mit dem Verschieben und dem Auffrischen des Formulares während der Berechnungen....

himitsu 24. Aug 2012 16:33

AW: Laufende Programme unter Windows 7 - werden die unter- oder gar abgebrochen?
 
Es kommt drauf an was du lesen willst, denn Einiges ist praktisch threadsicher (vorallem wenn es wärend der Threadlaufzeit garantiert nicht verändert wird), aber Vieles nicht.

also Ja&Nein


Aber unabhängig von der VCL/Synchronize gibt es auch noch CriticalSections, ReadWriteSynchronizer, Events, Messages uvm.

jfheins 24. Aug 2012 16:34

AW: Laufende Programme unter Windows 7 - werden die unter- oder gar abgebrochen?
 
Du kannst synchronize zwar keine Parameter übergeben, aber du kannst ja in der TThread Klasse private Felder benutzen ;)
Lesende Zugriffe sind auch zu synchronisieren, sonst kann es passieren dass du einen ungültigen Wert liest. (Vor allem: Du weißt ja normalerweise nicht, was noch alles im Getter abläuft. Canvas.Pixels[] ist so ein Kandidat wo "nur lesen" doch noch ne ganze Menge an Zeug auslöst...)

Delphi-Laie 24. Aug 2012 16:38

AW: Laufende Programme unter Windows 7 - werden die unter- oder gar abgebrochen?
 
Ja, danke an Dich, nein, Euch beide, und alle anderen (die freundlich waren), laßt es gut sein, ich bin jetzt ausreichend mit Informationen versorgt, um eine Weile allein weiterzuwerkeln.

himitsu 24. Aug 2012 16:38

AW: Laufende Programme unter Windows 7 - werden die unter- oder gar abgebrochen?
 
Das einfachste Beispiel für ein unsicheres "nur Lesen" ist ein Stream.
Wenn man aus dem Stream was ausließt, dann passieren intern auch ein paar Schreibzugriffe (also vonwegen "nur lesen"), welche z.B. den Positionszeiger verschieben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:04 Uhr.

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