Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Programm blockiert ganz Windows (https://www.delphipraxis.net/175533-programm-blockiert-ganz-windows.html)

Gruber_Hans_12345 29. Jun 2013 00:42

Programm blockiert ganz Windows
 
Hi

Hab mal eine Frage, an was liegt es, dass mein Programm, wenn es etwas tut (zb per IBX Daten abruft, oder einfach ne große schleife, wo was gemacht wird)
Dass das ganze Windows hängt?

Der Taskmanager zb geht nur kurz auf, und das wars, Programme umschalten mit Alt Tab geht auch nicht mehr, aber wenn ein Texteditor offen ist, dann kann man in dem nach schreiben, wenn man den bereich noch gesehen hat vorher.

Wenn mein Programm mit der Ausführung fertig ist dann geht wieder alles ganz normal.

Wo kann ich da zum suchen anfangen?

Perlsau 29. Jun 2013 06:03

AW: Programm blockiert ganz Windows
 
Windows ist ereignisorientiert. Ereignisse erzeugen Messages. Während eines Schleifendurchlaufs werden keine Messages abgearbeitet, wenn du das nicht in dein Programm einbaust. Füge dazu in deiner Schleife mindestes ein Application.ProcessMessages ein und du wirst sehen, daß dann wieder alles abgearbeitet wird. Alternativ kannst du solche Schleifen auch in einen Thread auslagern, was für Anfänger gewöhnlich jedoch zu hohe Anforderungen stellt.

Bernhard Geyer 29. Jun 2013 08:22

AW: Programm blockiert ganz Windows
 
Ganz blockieren ist eigentlich nicht möglich. Aber im Zusammenhang mit hoher Festplattenlast + Virenscanner kann die Verarbeitung schon sehr verzögert werden.

Perlsau 29. Jun 2013 08:32

AW: Programm blockiert ganz Windows
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1220012)
Ganz blockieren ist eigentlich nicht möglich. Aber im Zusammenhang mit hoher Festplattenlast + Virenscanner kann die Verarbeitung schon sehr verzögert werden.

Du hast sicher recht damit, für den gemeinen Anwender erscheint das aber schon so. Ich hab das selber schon oft erlebt, z.B. wenn ich einmalig größere Datenmengen zwischen Datenbanken kopiere (z.B. beim Umstieg auf ein anderes DBMS) und vor oder nach dem Next in der While Not Dataset.Eof-Schleife mal wieder Application.ProcessMessages vergessen habe. In solchen Fällen kannst du mit deinem Windows kaum noch arbeiten, obwohl natürlich hin & wieder die eine oder andere Message gaaanz laaangsaaam verarbeitet wird :stupid:

Da hilfts auch nicht, im Taskmanager die Priorität des Prozesses zu verringern ...

Gruber_Hans_12345 29. Jun 2013 09:36

AW: Programm blockiert ganz Windows
 
Zitat:

Zitat von Perlsau (Beitrag 1220003)
Windows ist ereignisorientiert. Ereignisse erzeugen Messages. Während eines Schleifendurchlaufs werden keine Messages abgearbeitet, wenn du das nicht in dein Programm einbaust. Füge dazu in deiner Schleife mindestes ein Application.ProcessMessages ein und du wirst sehen, daß dann wieder alles abgearbeitet wird. Alternativ kannst du solche Schleifen auch in einen Thread auslagern, was für Anfänger gewöhnlich jedoch zu hohe Anforderungen stellt.

Ich dachte mir das Application.ProcessMessages brauche ich in den SChleifen nur damit MEIN programm noch refresht wird und reagiert

In meinem Fall reagieren der Task Manager und das umsachalten IM WINDOWS mit zb "Alt Tab" gar nicht mehr

Gruber_Hans_12345 29. Jun 2013 09:40

AW: Programm blockiert ganz Windows
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1220012)
Ganz blockieren ist eigentlich nicht möglich. Aber im Zusammenhang mit hoher Festplattenlast + Virenscanner kann die Verarbeitung schon sehr verzögert werden.

Nein, Festplattenlast gibts in dem Fall fast gar nicht, es wird zB.: einfach eine richtig große Datenmenge vom Firebird Server geholt .... in der Zeit blockiert natürlich mein Programm

ABER eben auch die anderen Programm bzw eigetnlich nur das Windows System ...

QuickAndDirty 29. Jun 2013 09:41

AW: Programm blockiert ganz Windows
 
Seit WindowsXP braucht ja Windows keine aktive Freigabe von Prozessorzeit durch den Entwickler.

Aber seltsamer weise gibt es doch immer wieder Dinge die Windows enfrieren lassen können. z.b.
wenn man sich auf einem Netzwerklaufwer zum erstenmal verbindet.
Oder wenn man in der Kommandozeile eine Konsolenanwendung aus einem Netzwerklaufwerk heraus startet.
Oder wenn man im Explorer auf die Netzwerkressourcen klickt und er sucht....alles friert ein.
Außer der Maus.

Ich hasse das...

Perlsau 29. Jun 2013 09:47

AW: Programm blockiert ganz Windows
 
Zitat:

Zitat von Gruber_Hans_12345 (Beitrag 1220014)
Ich dachte mir das Application.ProcessMessages brauche ich in den SChleifen nur damit MEIN programm noch refresht wird und reagiert

Es ist, wie ich es oben beschrieben habe: Dein Programm blockiert die Messages, wenn du sie nicht abarbeitest. Messages werden in Windows reihenweise an alle Tasks quasi "durchgereicht" (stimnt nicht ganz, denn eigentlich landen Messages einfach in der Message-Queue). Wenn das Ziel einer Message nicht der Task ist, für den die Message bestimmt ist, dann kriegt sie der nächste Task, um zu prüfen, ob sie für ihn ist. Auf diese Weise kann jedes Programm auch Messages, die für andere Programme bestimmt sind, abfangen und darauf reagieren.

Alles, soweit mir bekannt, ich kann mich auch irren ...

Zitat:

Zitat von Gruber_Hans_12345 (Beitrag 1220014)
In meinem Fall reagieren der Task Manager und das umsachalten IM WINDOWS mit zb "Alt Tab" gar nicht mehr

Na dann bau halt mal, wie empfohlen, Application.ProcessMessages in deine Schleife ein.

Perlsau 29. Jun 2013 09:56

AW: Programm blockiert ganz Windows
 
Zitat:

Zitat von Gruber_Hans_12345 (Beitrag 1220015)
Nein, Festplattenlast gibts in dem Fall fast gar nicht, es wird zB.: einfach eine richtig große Datenmenge vom Firebird Server geholt .... in der Zeit blockiert natürlich mein Programm
ABER eben auch die anderen Programm bzw eigetnlich nur das Windows System ...

Wenn dein Firebird-Server auf demselben BS läuft wie deine Anwendung, dann entsteht selbstverständlich ausgiebiger Festplattenzugriff beim Einlesen großer Datenmengen in den Speicher. Da du aber nur selten eine riesige Datenmenge im Speicher zur Verfügung haben mußt, solltest du deine Datasets so einstellen, daß eben nicht alles geholt wird. Bei mir mit IbDac stelle ich dazu das Property FetchAll auf False. Bei großen Datenmengen entsteht z.B. auch beim Setzen von IndexFieldNames (sortieren) eine hohe Prozessorlast ...

nahpets 29. Jun 2013 10:22

AW: Programm blockiert ganz Windows
 
Und nicht vergessen, Windows hat eine Auslagerungsdatei und die wird benutzt, auch wenn noch Speicher frei ist. Und das gibt Festplattenzugriff in nicht zwingend unerheblichem Maße. Auch dann, wenn die Daten von einem X-beliebigen anderen Datenbankserver geholt werden.

Schau doch mal, nach Einbau von Application.ProcessMessages in der Schleife, im Taskmanager nach, ob und wie sich die Nutzung des virtuellen Speichers Deines Programmes ändert. Dann siehst Du, ob auf die Festplatte zugegriffen wird.
Und schau mal, ob sich die Anzahl der Seitenfehler verändert, dann wird Speicherinhalt aus der Auslagerungsdatei in den Arbeitsspeicher geholt. Und dahinter stecken Festplattenzugriffe. Ggfls. werden andere Programme aufgefordert Speicher freizugeben oder der Speicherinhalt anderer Programme wird von Windows in die Auslagerungsdatei verschoben, auch da stecken Festplattenzugriffe hinter.

Wenn man sehr viel Arbeitsspeicher hat, kann man mal den Versuch starten, Windows ohne Auslagerungsdatei zu konfigurieren. Gerade bei Datenbankanwendungen habe ich wiederholt die Erfahrung gemacht, dass sie dadurch deutlich beschleunigt werden können.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:52 Uhr.
Seite 1 von 5  1 23     Letzte »    

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