Autor Beitrag
Roboman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 115

WinXP
Delphi 2005 Prof.; Delphi 6 Prof.; C++; C; Basic
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Mo 29.05.06 15:47 
Jep, durch unbedachte Anwendung davon kann es passieren, dass Blödsinn dabei rauskommt. Zum Beispiel:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 115

WinXP
Delphi 2005 Prof.; Delphi 6 Prof.; C++; C; Basic
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 115

WinXP
Delphi 2005 Prof.; Delphi 6 Prof.; C++; C; Basic
BeitragVerfasst: 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. :wave:
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 115

WinXP
Delphi 2005 Prof.; Delphi 6 Prof.; C++; C; Basic
BeitragVerfasst: Mi 31.05.06 20:52 
Danke dir für die Info. Ich werd es berücksichtigen.