Autor |
Beitrag |
Roboman
      
Beiträge: 115
WinXP
Delphi 2005 Prof.; Delphi 6 Prof.; C++; C; Basic
|
Verfasst: Mo 29.05.06 15:40
Hallo Leute,
ich glaub ich hab ne ganz triviale Frage, aber ich hab im Moment einen Mamutbaum vor dem Kopf. Was genau macht "Application.Processmessage"? Kann es sein, das wenn ich das zu oft verwende, dass dann bestimmte Teile meines Quellcodes anfangen zwischendurch mal Blödsinn zu machen. Wie und wo setzt man sowas genau ein. Von meinem Lehrer weiß ich nur, das wenn "Application.Processmessage" verwendet wird, das das Programm immer im Hintergrund auf alles mögliche hört. Kann es dadurch passieren, das mein Quellcode, der von der Logik her korrekt ist, dadurch ins schleudern kommen kann? Ich bin über jede Antwort dankbar. Somal hier hellere Köpfe versammelt sind als bei uns in der Schule, und die schimpfen sich dann Lehrer.
Ich wünsch euch eine schöne Woche.
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Mo 29.05.06 15:42
Wie die Bezeichnung der Methode schon sagt: Das Programm wird angewiesen, die Windows-Events, die es Betreffen abzuarbeiten.
_________________ Markus Kinzler.
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mo 29.05.06 15:47
Jep, durch unbedachte Anwendung davon kann es passieren, dass Blödsinn dabei rauskommt. Zum Beispiel:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Procedure Button1.Click... begin Kopiere Datei C:\test.txt nach D:\test.txt; Application.processmessages; Kopiere Datei D:\test.txt nach E:\test.txt; end;
Procedure Button2.Click begin lösche Datei D:\test.txt; end; |
Wenn nun Button1 geklickt wurde, und während des Kopiervorgangs Button2 geklickt wurde, dann wird die gerade erstellte Datei gelöscht, und Button1.Click kann nicht sinnvoll weitergeführt werden.
_________________ We are, we were and will not be.
|
|
Roboman 
      
Beiträge: 115
WinXP
Delphi 2005 Prof.; Delphi 6 Prof.; C++; C; Basic
|
Verfasst: Mo 29.05.06 16:09
Servus Leute,
danke für die schnellen und informativen Antworten. Dann werd ich wohl oder übel mal mein Programm checken und nachsehen, wo ich es am sinnvollsten anbringe und wo ich es am besten weg lassen.
Noch zwei Fragen hab ich.
1. Gibt es irgendwelche Richtlinien, wie und wo man Application.Processmessage einsetzte und wo nicht?
2. Kann ein Programm auch ohne Application.Processmessage auskommen, also MUSS ich es einsetzten oder kann man es einsetzen.
Sorry für die Fragen, aber ich versuche das was mein Pauker mir bei gebracht hat, so zu richten, das was anständiges bei mir dabei rauskommt.
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mo 29.05.06 16:15
Richtlinien dafür gibts afaik keine richtigen. Vermeiden kann man APM in der Regel durch einsetzen von Threads, was aber gerade für Anfänger nicht einfach (und noch gefährlicher) ist.
In der Regel kann man es dann sinnvoll einsetzen, wenn z.B. eine Operation sehr oft in einer Schleife durchgeführt werden soll, und es absehbar ist, dass das etwas länger dauert. Dann kann man alle paarhundert Schleifendurchgägne APM aufrufen, und damit z.B. den Klick auf einen "Abbrechen"-Button bemerken, so dass man dann mit Break die Schleife vorzeitig beenden kann.
Es empfiehlt sich, vor Beginn einer solchen etwas länger dauernden Funktion alle Steuerelemente, die die Operation durcheinanderbringen können, vorher zu disablen, und anschließend wieder zu enablen. In meinem Beispiel von oben wäre es z.B. mehr als sinnvoll, im Button1.Click den Button2 vorher "auszuschalten".
_________________ We are, we were and will not be.
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Mo 29.05.06 16:17
Immer wenn eine Routine lang braucht, sollte man ProcessMessages aufrufen. wenn nicht reagiert das Programm nicht mehr auf Messages ( redraw, Klick auf Buttons, Programm schließen, usw.)
_________________ Markus Kinzler.
|
|
Roboman 
      
Beiträge: 115
WinXP
Delphi 2005 Prof.; Delphi 6 Prof.; C++; C; Basic
|
Verfasst: Mo 29.05.06 16:41
Ok, ich glaub ich hab es verstanden. Also, im Endeffekt, so mein Programm ist ziemlich klein, zur Zeit lausche ich nur der seriellen Schnittstelle was sie so schickt, so als kleiner Spion sozusagen. Da gibt es kaum wahrhaft viele Schleifen oder lange Prozesse. Da kann ich es also komplett weg lassen. Mal sehen. Werd es einfach ausprobieren. Herzlichen Dank für die Antworten. Ich hoffe ich komme irgendwann mal in die Situation einem hier im Forum weiter helfen zu können.
Ich wünsch euch noch was. 
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Mo 29.05.06 16:44
In diesem fall solltest du es aber Aufrufen, so dasß er währrend des Wartens etwas anderes macht.
_________________ Markus Kinzler.
|
|
Roboman 
      
Beiträge: 115
WinXP
Delphi 2005 Prof.; Delphi 6 Prof.; C++; C; Basic
|
Verfasst: Mi 31.05.06 20:52
Danke dir für die Info. Ich werd es berücksichtigen.
|
|