AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Application - Hang (Anwendung Reagiert nicht) bei längeren Operationen: Lösung?
Thema durchsuchen
Ansicht
Themen-Optionen

Application - Hang (Anwendung Reagiert nicht) bei längeren Operationen: Lösung?

Ein Thema von DSCHUCH · begonnen am 12. Apr 2013 · letzter Beitrag vom 18. Apr 2013
Antwort Antwort
DSCHUCH

Registriert seit: 6. Jun 2007
Ort: Dresden
187 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Application - Hang (Anwendung Reagiert nicht) bei längeren Operationen: Lösung?

  Alt 15. Apr 2013, 22:36
Kann dies mal jemand auf Windows Vista/XP/8 probieren? Die Testanwendung bietet ja die Option mit dem Radiobutton die Funktion an- und abzuschalten.
  Mit Zitat antworten Zitat
anro78

Registriert seit: 24. Okt 2005
25 Beiträge
 
#2

AW: Application - Hang (Anwendung Reagiert nicht) bei längeren Operationen: Lösung?

  Alt 16. Apr 2013, 07:55
Zitat:
Die Variante sämtliche längeren Operationen in Threads auszulagern finde ich ja von vorn herein absolut blödsinnig.
Aber genau das macht man, wenn man eine Anwendung robust entwickeln will, alles andere ist doch nur Herumdoktern an den Symptomen. Was machst du denn z.B. bei einer SQL-Abfrage, die einige Sekunden dauert? Dann hast du gar keine Möglichkeit ApplicationRefresh aufzurufen! Die Implementierung von Threads zur Ausführung von Abarbeitungs-Jobs außerhalb des VCL-Mainthreads ist nun wirklich kein Teufelszeug und innerhalb weniger Minuten implementiert. Man hat die Möglichkeit, den Nutzer über eine Statusanimation entweder definiert (Progress) oder undefiniert (Marquee) über den Fortschritt zu informieren, die Anwendung bleibt weiterhin reaktionsfähig (kann z.B. minimiert oder das Fenster verschoben werden). Und eine Funktion, die sämtliche Top-Level-Controls in einem Fenster während der Abarbeitung sperrt ist auch schnell geschrieben.
  Mit Zitat antworten Zitat
musicman56
(Gast)

n/a Beiträge
 
#3

AW: Application - Hang (Anwendung Reagiert nicht) bei längeren Operationen: Lösung?

  Alt 16. Apr 2013, 08:08
Kann dies mal jemand auf Windows Vista/XP/8 probieren?
Unter XP, Vista und Win8 in der VM probiert, keine Auffälligkeiten gefunden.

Anmerkung: Wenn ich ein "echter" User wäre, dann würde ich wahrscheinlich versuchen das Fenster zu verschieben (was nicht geht, und wünschenswert wäre) oder es zu minimieren (was nach Ablauf der Schleife passiert und eigentlich auch nicht passieren sollte).
  Mit Zitat antworten Zitat
SebastianZ

Registriert seit: 23. Jul 2009
89 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Application - Hang (Anwendung Reagiert nicht) bei längeren Operationen: Lösung?

  Alt 16. Apr 2013, 08:56
Verstehe ich was falsch, oder spricht irgend was gegen Application.ProcessMessages?
  Mit Zitat antworten Zitat
musicman56
(Gast)

n/a Beiträge
 
#5

AW: Application - Hang (Anwendung Reagiert nicht) bei längeren Operationen: Lösung?

  Alt 16. Apr 2013, 09:34
Verstehe ich was falsch, oder spricht irgend was gegen Application.ProcessMessages?
Die Spezialisten hier können das sicher besser erklären und begründen, aber ich versuch's mal: Wenn die App nur ein einzelnes Fenster hat, ist Application.ProcessMessages kein Problem. Sobald aber ein weiteres Fenster hinzukommt, im ungünstigsten Fall ein modaler Dialog, "lebt" das aufrufende Fenster bei einem Application.ProcessMessages weiter, und dann kann es zu unerwünschten Nebeneffekten kommen. Gerade bei modalen Fenstern geht man ja davon aus, dass der Programmablauf erst fortgesetzt wird, wenn das modale Fenster beendet wird.

Was anro78 vorgeschlagen hat, wäre aus meiner Sicht darum die elegantere Lösung. Ich bin Autodidakt und habe mangels dem entsprechendem Wissen mit Threads bisher überhaupt nicht gearbeitet, aber irgendwann werd ich mir das auch noch reinziehen

BTW: Bin schon so oft über Application.ProcessMessages gestolpert, und darum interessiert mich auch dieser Thread.
  Mit Zitat antworten Zitat
DSCHUCH

Registriert seit: 6. Jun 2007
Ort: Dresden
187 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Application - Hang (Anwendung Reagiert nicht) bei längeren Operationen: Lösung?

  Alt 16. Apr 2013, 10:34
Application.ProcessMessages kann zu rekursiven Aufrufen von Clickereignissen können, da Application.ProcessMessages den aktuellen Code unterbricht und Ereignisse neu verarbeitet.

Hast Du nur ein Form und eine Schleife mit 10000 Durchläufen, darin ein Application.ProcessMessages, kann der Nutzer den Button drücken, obwohl die Schleife noch nicht durchlaufen wurde. Die Schleife wird dann "Rekursiv" neu aufgerufen und idR hat man Access Violations.

Es ist eigentlich auch nicht möglich alles in threads zu packen, da man zB auch externe Komponenten hat, welche nicht Threadsave sind, welche aber wiederrum ein "OnProgress" anbieten.

Alle Forms Disablen und Enablen funktioniert auch nicht, da dann zB Timer feuern und Modale Fenster zerschossen werden.
  Mit Zitat antworten Zitat
anro78

Registriert seit: 24. Okt 2005
25 Beiträge
 
#7

AW: Application - Hang (Anwendung Reagiert nicht) bei längeren Operationen: Lösung?

  Alt 17. Apr 2013, 09:08
Es ist schon möglich, alles in Threads zu packen. Das Zauberwort ist Schichtentrennung, Logik muss vom GUI getrennt werden. Zugegeben, Delphi macht das einem nicht leicht, aber bei einem robustem Programm führt kein Weg daran vorbei.

Bei der Verwendung von Threads muss alles was auf die VCL zugreift über den Aufruf von Synchronize synchronisiert werden, so auch die Anzeige von Progress usw.

Datenquellen auf denen im Thread gearbeitet wird, müssen entweder vorher abgebunden bzw. diabled werden.

Und von der Verwendung von Timern würde ich mal komplett abraten, das ist einfach nur Mist und sollte wirklich nur in Ausnahmefällen eingesetzt werden.
  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 16:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz