AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Programm reagiert nicht - Windows-Test?
Thema durchsuchen
Ansicht
Themen-Optionen

Programm reagiert nicht - Windows-Test?

Ein Thema von himitsu · begonnen am 30. Mär 2012 · letzter Beitrag vom 31. Mär 2012
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#1

Programm reagiert nicht - Windows-Test?

  Alt 30. Mär 2012, 16:30
Wie prüft eigentlich Windows, ob ein Programm nicht reagiert?

Wird eventuell eine Message geschickt und wenn ja welche.



Der Grund ist Folgender:

Wir haben im Programm an massig vielen Stellen ein Application.ProcessMessages, welches oftmals nur für einen grafischen Refresh zustäständig ist und damit das Programm nicht völlig einfriert.
Aber leider ist es dabei ja möglich auf irgendwelchen Buttons rumzucklicken, welches an ein paar Stellen zu Problemen führt.
Und alles irgendwie anders zu machen, ist auf die Schelle auch nicht so schnell möglich. (ist alles über Jahrzehnte historisch gewachsen)

Nun hab ich also erstmal ein eigenes ProcessDrawMessages erstellt, welches sich nur um PM_QS_PAINT und PM_QS_SENDMESSAGE kümmert. (MSDN-Library durchsuchenPeekMessage)

Nja, und jetzt müßte ich noch irgendwie Windows sagen, daß das Programm nicht "wirklich" hängt und mal sehn, welche Messages auch noch unbedingt verarbeitet werden müssen.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

AW: Programm reagiert nicht - Windows-Test?

  Alt 30. Mär 2012, 18:02
laut diesem Blog Eintrag: http://blogs.msdn.com/b/meason/archi...for-hangs.aspx
Musst du wohl zwangsläufig Eingaben verarbeiten. Und wenn du sie einfach ignorierst
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#3

AW: Programm reagiert nicht - Windows-Test?

  Alt 30. Mär 2012, 18:09
Ich finde auch, du solltest alle Messages verarbeiten. Es könnte sonst ziemlich überraschend wirken, wenn plötzlich alle gemachten Mausklicks und Tastatureingaben quasi auf einmal verarbeitet werden, nur weil sie noch in der Message-Queue stecken.

Ich weiß, ich erzähle nichts Neues, aber du solltest das Konzept schnellstmöglich ändern, sonst wächst es noch weitere Jahrzehnte so weiter.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Programm reagiert nicht - Windows-Test?

  Alt 30. Mär 2012, 19:59
Es werden ja Messages verarbeitet.
Allerdings erstmal nur die Nicht-Benutzereingaben.
Die Maus- und TastatusMessages werden entweder später verarbeitet (sobald die Prozeduren fertig sind, mit ihrer Arbeit) oder die werden einfach gelöscht (abgerufen und nicht verarbeitet).

Zitat:
nur weil sie noch in der Message-Queue stecken.
Joar, ist uns auch eingefallen.
Eventuell die Usermessages verwerfen
Aber so ist es schonmal besser, da hier alles nacheinander und wenigstens nicht durcheinander verarbeitet wird.

Nja, ist halt alles nicht so einfach.
Ja, natürlich wäre es besser, alles abzusuchen und überall z.B. die Buttons zu deaktivieren, während der Arbeit, aber das dauert auch eine Weile.

Aber jetzt ist erstmal Wochenende und die Arbeit geht dann am Montag weiter.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

AW: Programm reagiert nicht - Windows-Test?

  Alt 31. Mär 2012, 12:35
... es besser, alles abzusuchen und überall z.B. die Buttons zu deaktivieren...
Vielleicht ist das gar nicht so schwer wie es im ersten Moment aussieht.
Man bräuchte eine Klasse (abgeleitet von TComponent) mit 2 Methoden: FreezeUI() und UnfreezeUI().
Delphi-Quellcode:
Freezer1.IgnoreControl := ButtonStop;
Freezer1.FreezeUI;
try
  MachWasDasSehrLangeDauertUndDerBenutzerNichtUnterbrechenDarf;
finally
  Freezer1.UnfreezeUI;
end;
Beim Einfrieren werden in einer Schleife alle Komponenten des Owners (=das Formular) durchgegangen.
Dabei wird geprüft:
TButton? TSpeedButton? TToolbar? TCoolbar? TMainMenu?
Visible? Enabled?
Alle gefundenen Komponenten, die Visible und Enabled sind werden in eine ObjectList eingetragen
und anschliesend wird das Property Enabled auf False gesetzt.
Dabei macht man sich zunutze, dass Enabled und Visible ab der Klasse TControl vorhanden sind.
Sollte die Komponente gleich dem IgnoreControl sein, dann findet das aber nicht statt.

Beim Auftauen braucht man nur noch die Objectliste durchgehen und für jede Komponente das Property Enabled wieder auf True zu setzen.

Ich denke, man könnte diese Freeze-Komponente in 0,5 bis 1 Stunde programmieren und es braucht vielleicht noch 2-3 Tage mehr bis man alles entdeckt hat was ich hier vergessen habe.

Geändert von sx2008 (31. Mär 2012 um 12:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: Programm reagiert nicht - Windows-Test?

  Alt 31. Mär 2012, 12:51
Vielleicht auch so was
Delphi-Quellcode:
procedure TForm2.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if MyFlag4Ignore then
    begin
    if (Msg.message = WM_Char)
       or (Msg.message = WM_LButtonDown)
       or .....
       or ...
       then

        Handled := true;
    end;
end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#7

AW: Programm reagiert nicht - Windows-Test?

  Alt 31. Mär 2012, 13:08
Vielleicht hilft auch TApplicationEvents.OnMessage
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: Programm reagiert nicht - Windows-Test?

  Alt 31. Mär 2012, 13:24
siehe
Vielleicht auch so was
Delphi-Quellcode:
procedure TForm2.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
Aber wozu das global (immer und überall) einbinden, wo ich schon eine lokale Variante hab (nur dort wo nötig).



@Freezer: Das müßte ich auch überall manuell einbauen und wenn, dann kann ich es auch gleich richtig machen.

Mir fällt da grade was ein.
Wir haben sowieso von fast allen Komponenten eigene Ableitungen verbaut.
Da könnte ich das "Click" unserer Buttons verändern, so daß sich der Button selber enablen/disablen kann, wärend die Klickprozedur läuft.
Ich glaub das währe wohl die ideale Lösung, für die meisten Problemstellen.
$2B or not $2B

Geändert von himitsu (31. Mär 2012 um 13:27 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:47 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