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? |
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.
|
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.
|
AW: Programm blockiert ganz Windows
Zitat:
Da hilfts auch nicht, im Taskmanager die Priorität des Prozesses zu verringern ... |
AW: Programm blockiert ganz Windows
Zitat:
In meinem Fall reagieren der Task Manager und das umsachalten IM WINDOWS mit zb "Alt Tab" gar nicht mehr |
AW: Programm blockiert ganz Windows
Zitat:
ABER eben auch die anderen Programm bzw eigetnlich nur das Windows System ... |
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... |
AW: Programm blockiert ganz Windows
Zitat:
Alles, soweit mir bekannt, ich kann mich auch irren ... Zitat:
|
AW: Programm blockiert ganz Windows
Zitat:
|
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. |
AW: Programm blockiert ganz Windows
Zitat:
|
AW: Programm blockiert ganz Windows
@Perlsau
Naja, 'ne Oracle-Datenbank auf 'ne RamDisk, ob das noch geht? Mit viel Speicher meine ich sowas von 32 oder 64 oder mehr GB :-) Aber das mit der RamDisk habe ich auch mal ausprobiert und feststellen müssen, dass das langsamer sein kann, als nur Arbeitsspeicher und Festplatte. Ok, das ist schon (gefühlt) ein paar Jahrzehnte her. |
AW: Programm blockiert ganz Windows
Zitat:
Zitat:
* Die verlinkte Testversion hat natürlich weniger ... |
AW: Programm blockiert ganz Windows
Also ich fände es ganz nützlich, wenn der TE grob beschreiben würde, was sein Programm auf welchem Rechner wie tut, statt hier "herumzuorakeln" :lol:
Alles lokal, über Intranet oder übers Indernett? |
AW: Programm blockiert ganz Windows
Für eine Beurteilung wäre es schon hilfreich das Betriebssystem zu kennen.
Ab Windows 7 sollte es solche gravierenden Hänger eigentlich nicht mehr geben, da hier mehrere Prozesse gleichzeitig ihre Oberfläche updaten können. Ein Blick in den Task-Manager kann auch nicht schaden und in der Leistungsansicht im Menü "Ansicht/Kernel-Zeiten anzeigen" einschalten. Wenn dort jetzt alles rot ist, dann ist idR die Festplatte am jaulen ;) |
AW: Programm blockiert ganz Windows
Zitat:
Zitat:
Zitat:
|
AW: Programm blockiert ganz Windows
Zitat:
|
AW: Programm blockiert ganz Windows
Zitat:
|
AW: Programm blockiert ganz Windows
Also der Datenbankserver ist auf einem anderen Rechner
Das Problem tritt hauptsächlich auf windows 7 (das ist mein Rechner) aber auch andere die Windows 8 haben haben gesagt des alles einfriert Und wenn es einfriert (also die Daten geladen werden (leider brauche ich alle Daten, da ein Pivot gefüllt wirt)) dann kann man den Taskmanager öffnen, er wird sozusagen einmal angezeigt und das wars, also reagiert auf keinen Mausklick oder so ... wenn ich im Hintergrund auf Notepad++ schalte, dann kann ich zwar keine Menüs öffnen im Notepad aber noch schreiben ... Das Problem ist das ich in der Laderoutine vom Firebird keine Porcessmessages einbauen kann..... |
AW: Programm blockiert ganz Windows
Zitat:
Dann verwende Threads |
AW: Programm blockiert ganz Windows
Zitat:
weil das ja nur ein sql.open ist was die ganze arbeit macht.... mich störts ja nicht das mein programm einfriert - aber warum der ganze rechner.... |
AW: Programm blockiert ganz Windows
Zitat:
Vielleicht sollte man die Abfage optimieren |
AW: Programm blockiert ganz Windows
Zitat:
|
AW: Programm blockiert ganz Windows
Zitat:
Selbst die billigesten PCs (Netbooks) haben schon zwei Kerne. Der normal-PC hat 4-8 Kerne. Ein einfaches Programm dieser Art wird den Prozessor nicht auslasten können. |
AW: Programm blockiert ganz Windows
Einen Tipp habe ich nicht aber...
Ich kenne ein ähnliches Verhalten unter Win7 gelegentlich vom InternetExplorer bzw. beim öffnen mehrerer Register. Nach einigen Sekunden läuft es dann wieder. Außerdem reagiert das System gelegentlich nicht mehr auf MouseOver und MouseClick (laufende Programme aber schon). Es hilft dann der Affengriff und zwei Klicks auf abbrechen. Der erste bringt die Mauserkennung zurück, der zweite schließt die Systemebene. |
AW: Programm blockiert ganz Windows
Hier rumzurätzeln warum das so ist bringt einfach nichts.
Fakt ist jedoch wenn du anderen Prozessen nicht die möglichkeit gibst weiterarbeiten zu können hält das System nun mal (scheinbar)an bis dein prozess beendet ist. Das ist einfach ein schlechter Programmierstil. Die lösung ist doch einfach. Blockiere nicht die Prozesse anderer Awendungen und gut ist. Kann ich nicht.. gibt es nicht. Das hilft immer
Delphi-Quellcode:
Wer also will dir verbieten dafür zu sorgen das andere prozesse ihren Dienst verrichten können
procedure WinProcessMessages;
// Allow Windows to process other system messages var ProcMsg: TMsg; begin while PeekMessage(ProcMsg, 0, 0, 0, PM_REMOVE) do begin if (ProcMsg.message = WM_QUIT) then Exit; TranslateMessage(ProcMsg); DispatchMessage(ProcMsg); end; end; FireBird ? :lol: gruss |
AW: Programm blockiert ganz Windows
mir war das einfach absolut neu, das wenn ich in mienem Programm die Message nicht verarbeite das dann alle anderen Programme dadurch in mittleidenschaft gezogen werden.
Aber das Problem, ist trotzdem ich habe leider auch Komponenten von mir, die einfach sehr sehr lange zum verarbeiten brauchen (zum Beispiel PivotTabellen, die rieseige Datenmengen verarbetien) und da kann ich nicht einfach rumwerklen im sourcecode, und dort ne message loop einbauen. Genau so schwer wird es sein das in nen Thread auszulagern, da diese Komponente natürlich auch grafisch ist ... und die GUI braucht (die ja nicht thread sicher ist) |
AW: Programm blockiert ganz Windows
Nach meiner Erfahrung treten solche Effekte unter Windows7 dann auf, wenn eine Komponente den Explorer nutzt, und eine Ereignisbehandlung länger dauert. Ein Beispiel ist der DateTimePicker. Wenn man hier in den OnChange-Event folgendes einhängt
Delphi-Quellcode:
dann hängt nach der Änderung des Datums der gesamte Desktop für 10s. Das liegt daran, dass der Explorer als zentrale Bedienoberfläche für 10s blockiert ist. Bei anderen Komponenten (z.B. TEdit) ist ein solches Verhalten nicht zu beobachten.
procedure TForm1.DateTimePicker1Change(Sender: TObject);
begin Sleep(10000) end; |
AW: Programm blockiert ganz Windows
Zitat:
|
AW: Programm blockiert ganz Windows
Ja ist ein total komisches verhalten vom System
Und es ist total egal welche Priorität ich meinem Programm gebe - hohe oder niedrige - das hat keinen einfluss! Wenn das programm sperrt, dann kann ich Alt-Tab drücken es kommt das schöne fenster mit den Vorschaubildern der aktiven Programmen, aber es bleibt beim ersten Fenster stehen, also ein weiteres Alt-Tab geht nicht mehr Die Vorschaubilder bleiben auch solange stehen bis mein programm fertig ist Wenn ich im hintergrund bei einer anderen Anwendung was rumschreibe oder so, dann sehe ich das sogar in den kleinen Vorschaubildern automatisch refresht! |
AW: Programm blockiert ganz Windows
Zitat:
Wie gesagt es sieht bei mir auch aus wie wenn "nur" der Desktop hängt |
AW: Programm blockiert ganz Windows
Zitat:
Erst unmöglich und dann doch? Na egal... sollte mich vielleicht etwas mehr zurückhalten. gruss |
AW: Programm blockiert ganz Windows
Das passiert beim Open einer Query?
Dann mach davor doch davor ein DisableControls und danach ein EnableControls. Dazwischen vielleicht noch ein Application.ProcessMessages. Ich kann mir nicht vorstellen, dass das Open den Rechner derartig ausbremst, aber die verbundenen Controls können schon einen ganze Menge verursachen. |
AW: Programm blockiert ganz Windows
Zitat:
aber braucht dafür natürlich sehr lange zum öffnen ... |
AW: Programm blockiert ganz Windows
Zitat:
Wenn Du dann die Daten abholst könnte es etwas Last geben. Das beschriebene Verhalten finde ich sehr seltsam. Gruß K-H |
AW: Programm blockiert ganz Windows
Zitat:
|
AW: Programm blockiert ganz Windows
Also hab gerade ein kleines Testprogramm geschrieben, mit dem ich das ganze nachstellen wollte -> und siehe da
in dem Testprogramm bleibt der Desktop aktiv -> also keine Probleme, und nur mein kleines Testprogramm hängt Also muss es irgendeinen nebeneffekt von meinem Hauptprogramm sein (Aber das sind leider schon doch ein paar zeilchen ... ;) ) |
AW: Programm blockiert ganz Windows
Bist du sicher, dass du nirgends SetPriorityClass verwendest?
Durchsuche mal den gesamten Code danach... Unter umständen auch den Code deiner Fremdcontrols (falls du den Code hast) |
AW: Programm blockiert ganz Windows
Zitat:
Ich habe ja nur 25% CPU Last auf das gesammte System gesehen in dem Fall .. |
AW: Programm blockiert ganz Windows
Wenn ich deinen ersten Post lese, dann steht da:
Zitat:
Manchmal ist es bei solchen Sachen auch ganz hilfreich, wenn man sich eine Logdatei mitschreibt und quasi jeden Schritt eine Zeitaufwendigen Funktion mit einem Zeitstempel mitloggt. So kann man dann explizit die verursachende Zeile finden.
Delphi-Quellcode:
Das hab ich mal so aus dem Kopf hier geschreiben. Also wenn Fehler drin sind, reißt mir nicht den Kopf ab.
procedure log(s: string);
var tc, tdiff: Cardinal; f: Textfile; logfile: string; begin tc:=GetTickCount; tdiff:=tc-stc; logfile:=extractfilepath(application.exefile)+'log.txt'; Assingfile(f, logfile); if fileexists(logfile) then append(f) else rewrite(f); writeln(f, inttostr(tdiff)+' '+s); closefile(f); application.processmessages; end; in der unit noch die stc: Cardinal deklarieren. Und am begin der fraglichen Funktion stc:=gettickcount; und dann nach bedarf ein log('jetzt wir SQL.open ausgeführt'); setzen. Hinterher kannst du in der Logdatei recht genau sehen, wo die Zeit verbraten wurde. Möglicherweise hilft das bei der Ergründung des Problems. Wenn's sinnvoll ist, dann kann man auch noch andere Variablen mit übergeben und loggen, damit man ggf. auch auf unlogische Daten oder so prüfen kann. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:46 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