AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Gespräch simulieren??

Ein Thema von thechus · begonnen am 4. Jun 2012 · letzter Beitrag vom 6. Jun 2012
Antwort Antwort
Seite 2 von 3     12 3      
WladiD

Registriert seit: 27. Jan 2006
Ort: Celle
135 Beiträge
 
Delphi 10.4 Sydney
 
#11

AW: Gespräch simulieren??

  Alt 5. Jun 2012, 09:28
Ihr solltet aufhören den Einsatz von Application.Processmessages zu empfehlen!

In einem Test-Projekt ist der Einsatz noch ok, aber wenn sich zu viele Application.Processmessages in einem Produktivsystem ansammeln, so hat das allerlei Seiteneffekte, die nicht nachvollziehbar und sehr schwierig zu debuggen sind.

Stellt euch doch einfach mal vor, was der Aufruf von Application.Processmessages alles ausführen kann: Timer werden abgearbeitet, Thread-Synchronisierung (TThread.Synchronize) wird durchgeführt, kurz gesagt alle Messages, und das in irgendeinem Event-Handler?!

Da hat Borland seinerzeit definitiv einen Designfehler gemacht, TApplication.Processmessages hätte protected sein müssen.

Ich arbeite an einer historisch gewachsenen Anwendung, die noch vor einem Jahr über 150 Aufrufe dieser Methode hatte, nunja, die Anwendung war in vielen Fällen einfach unberechenbar. Mit jedem Release versuche ich es Stück für Stück zu entfernen und es läuft immer besser.
Waldemar Derr
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Gespräch simulieren??

  Alt 5. Jun 2012, 09:50
Zitat:
wirre Seitenefekte
Wo ich nur zustimmen Kann.
http://www.delphipraxis.net/167456-p...dows-test.html
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#13

AW: Gespräch simulieren??

  Alt 5. Jun 2012, 12:11
Ich glaube immer noch fest daran, das Fragen direkt beantwortet werden sollten und Tipps, wie man es besser machen kann, als unverbindliche Empfehlung zusätzlich dargeboten werden sollten.

Die Eingangsfrage war klar: "Hier ist mein Code, der klappt nicht. Wieso?"
Antwort: "Nimm Application.ProcessMessages"

Trotzdem sind die weitergehenden Diskussionen und Anmerkungen, insbesondere die über den schlechten Stil in Bezug auf die ProcessMessages, durchaus sehenswert und sehr interessant.

Persönlich halte ich nicht viel davon, Methoden, mit denen man Schindluder treiben kann, in die 'protected' Ecke zu verbannen. Das müsste man dann auch mit einem Gaspedal beim Auto machen
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#14

AW: Gespräch simulieren??

  Alt 5. Jun 2012, 20:44
[...] das Fragen direkt beantwortet werden sollten [...]

Die Eingangsfrage war klar: "Hier ist mein Code, der klappt nicht. Wieso?"
Antwort: "Nimm Application.ProcessMessages"
Die Eingesfrage war nicht warum. Eigentlich war gar keine Frage vorhanden. Interessanter finde ich eher diesen Teil des Ausgansposts:

Leider führt er alle Befehle gleichzeitig aus
Ich hab's auch schon mit einem Timer versucht.
Da kam das selbe bei raus.
Also wenn man es macht wie Iwo Asnet es meint, dann sollte geklärt werden, dass
  • Windows hier definitiv nichts gleichzeitig ausführt
  • warum sein gezeigter Code nicht klappt
  • dass sein Timer-Versuch wohl fehlerhaft gewesen sein muss
  • und was die richtige Lösung des Problems ist

Und wenn man will, kann man auch den Hack Application.ProcessMessages erwähnen. Natürlich ist es eine Sache des Antwortenden, ob er Lust und Zeit hat, dem TE breit zu erklären warum das alles so ist. Immerhin ist das System für einen nicht-eingeweihten nicht so einfach zu verstehen. Aber besonders der Timer gehört zu den Grundlagen, die man als bessere Alternative zur genannten Methode durchaus darlegen darf.

Liebe Grüße,
Valentin
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#15

AW: Gespräch simulieren??

  Alt 6. Jun 2012, 07:16
  • Windows hier definitiv nichts gleichzeitig ausführt
  • warum sein gezeigter Code nicht klappt
  • dass sein Timer-Versuch wohl fehlerhaft gewesen sein muss
  • und was die richtige Lösung des Problems ist
Die Panels werden erst beim nächsten Abarbeiten der anstehenden Messages neu gezeichent => Windows führt die Befehle scheinbar gleichzeitig aus.
Durch den Aufruf von ProcessMessages klappt der gezeigte Code (Hilfe vollständig gegeben), der Timer-Versuch ist nicht dokumentiert und
die 'richtige' Lösung ist abhängig vom Problem und der Fragestellung.

Hmmm. Was wolltest Du nochmal?

Ich habe die Frage auch so verstanden, das er wissen wollte, wieso sein Code nicht klappt. Dessenungeachtet ist das hier mal wieder Wortklauberei.

Ehrlich gesagt halte ich es für durchaus legitim, in einem Button-Event, der etwas länger dauert, ein Application.ProcessMessages aufzurufen.
Wenn ich z.B. einen Batch starte, der z.B. 10000 Datensätze importiert, zeige ich Fortschritt, verstrichene Zeit, usw. innerhalb der Schleife an und rufe dann Application.ProcessMessages auf.
Wieso sollte man das anders machen? Es ist straight forward und reicht vollkommen aus.
Ich vermute, die weitaus meisten Fortschrittsanzeigen sind ähnlich aufgebaut.
Insofern verstehe ich nicht, wieso der Aufruf von ProcessMessages ein Hack sein soll.
Klar, man kann den ganzen Schmoo in einen Thread auslagern.
Klar, man kann die Anzeige über einen Timer lösen.
Klar, man kann endlos darüber diskutieren.
Aber warum?
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#16

AW: Gespräch simulieren??

  Alt 6. Jun 2012, 09:28
Es geht nicht darum, ewig zu diskutieren, sondern nur um die hier im Forum übliche "Meine Sicht ist die einzig wahre..."-Streiterei.

WladiD hat vollkommen Recht: Der Aufruf von Application.ProcessMessages kann zu schwer lokalisierbaren Zugriffsverletzungen führen. Dazu gab es erst vor kurzem eine Diskussion.
Manche Probleme lassen sich allerdings nur unzureichend ohne den Einsatz von Application.ProcessMessages lösen, da damit nicht nur Nachrichten abgearbeitet, sondern zum Teil auch Rechenzeit abgegeben wird, was für manche Aufgaben äußerst wichtig ist. Allerdings sollten dann auch entsprechende Sicherheitsmaßnahmen getroffen werden.
Wenn es nur darum geht, ein Steuerelement zu aktualisieren, reicht der Aufruf der Methode Update vollkommen aus, ist ebenfalls in einer Zeile erledigt und birgt nicht die mit Application.ProcessMessages verbundenen Risiken:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  n: Integer;
begin
  for n:=0 to 10 do
  begin
    Label1.Caption:=IntToStr(n);
    Label1.Update;
    Sleep(200);
  end;
end;
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#17

AW: Gespräch simulieren??

  Alt 6. Jun 2012, 09:37
Ist das tatsächlic so, dass der Aufruf von Update ausreicht? Ich hätte vermutet, dass Update nur eine Nachricht an das entsprechende Element schickt, die aber ggf. nur abgearbeitet wird, wenn Windows "Zeit" dafür hat und explizit mit Application.ProcessMessages dazu aufgefordert wird. In deinem Beispiel funktioniert das wohl, aber grundsätzlich ist das kein Ersatz, oder?
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Gespräch simulieren??

  Alt 6. Jun 2012, 09:43
Update ruft standardmäßig direkt/sofort MSDN-Library durchsuchenUpdateWindow auf.

Bei Update, Refresh und Repaint kommt aber letzendlich darauf an, wie bei dem Control diese Methoden implementiert sind. (also ob und wie sie überschrieben/verändert wurden)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: Gespräch simulieren??

  Alt 6. Jun 2012, 09:44
Update veranlasst den Parent, UpdateWindow auszuführen. Dazu sagt das MSDN:
Zitat:
The function sends a WM_PAINT message directly to the window procedure of the specified window, bypassing the application queue.
Das bedeutet im Umkehrschluss, dass lediglich das Control neu gezeichnet, aber keine anderen Nachrichten abgearbeitet werden. Die angesprochenen Seiteneffekte treten somit nicht auf, man kann also z.B. auch das Fenster nicht verschieben etc.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#20

AW: Gespräch simulieren??

  Alt 6. Jun 2012, 11:45
Betreffs des Eingangsproblems:
Man könnte das durchaus mit einem Timer sehr elegant lösen.
Man nimmt sich eine (integer) Zählvariable, die auf Null gesetzt wird.
Diese wird im Timer-Ereignis jedesmal erhöht.
Je nach ihrem Wert kann in einer Case-Anweisung bestimmt werden, was passieren soll.
Ich nenne sie hier mal Phase.

Delphi-Quellcode:
procedure TfrmMain.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled:=False;
  case Phase of
    1: begin
         //erstes Panel beschriften, sichtbar, Refresh
         Timer1.Interval:=1500; //1,5 sek
       end;
    2: begin
         //zweites Panel beschriften, sichtbar, Refresh
         Timer1.Interval:=1000; //1 sek
       end;
    3: begin
         //drittes Panel beschriften, sichtbar, Refresh
         Timer1.Interval:=2000; //2 sek
       end;
    //beliebig erweiterbar....
  end;
  inc(Phase);
  if Phase < 4 then //maximalwert der Phase + 1, ansonsten wird der Timer nicht mehr enabled
   Timer1.Enabled:=True; //nächsten Intervall durchlaufen
end;
So kann man beliebige Aktionen in einer festlegbaren Reihenfolge ausführen.
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      

 

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 13:39 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