Entwickler-Ecke

Sonstiges (Delphi) - Wo ist der Programmablauf auserhalb von Aktionen


delphino - So 21.01.07 19:51
Titel: Wo ist der Programmablauf auserhalb von Aktionen
Hallo,

ich bin Delphi-Anfänger. Oft wird ja auf irgendwelche Klicks mit der Maus entsprechend reagiert.
Wo dort der Code hinkommt habe ich auch einigermaßen verstanden.

Aber: Wo läuft in Delphi der normale "Main" Prozeß ab, wie ich ihn aus anderen Programmiersprachen kenne?
Wo kann ich in Delphi dort im Hintergrund was berechnen lassen o.ä. und darauf zugreifen.

Gruß

Wolfgang


BenBE - So 21.01.07 20:11

Delphi tut im Wesentlichen nur so, als ob es außerhalb von Events nix tun würde. Genaugenommen wird da nämlich eine Schleife in Forms.pas in der Methode TApplication.Run ausgeführt, die auf eine neue Nachricht von Windows wartet.

Um diese "ungenutzte" Zeit dennoch zu benutzen gibt es zwei Möglichkeiten:

1. Du schreibst eine Ereignisbehandlung für das Ereignis TApplication.OnIdle
oder
2. Du schreibst einen zweiten Thread

die dann wiederum deinen gewünschten Quelltext ausführen. Für beides findest Du hier im Forum eine Vielzahl an Beispielen.


Reinhard Kern - So 21.01.07 22:07
Titel: Re: Wo ist der Programmablauf auserhalb von Aktionen
user profile icondelphino hat folgendes geschrieben:
Hallo,

ich bin Delphi-Anfänger. Oft wird ja auf irgendwelche Klicks mit der Maus entsprechend reagiert.
Wo dort der Code hinkommt habe ich auch einigermaßen verstanden.

Aber: Wo läuft in Delphi der normale "Main" Prozeß ab, wie ich ihn aus anderen Programmiersprachen kenne?
Wo kann ich in Delphi dort im Hintergrund was berechnen lassen o.ä. und darauf zugreifen.

Gruß

Wolfgang


Delphi wartet auf eine Mausklick, Tastendruck usw. Das ist nicht wirklich etwas neues, das tun Konsolenprogramme normalerweise ja auch, und genau wie bei einem solchen Programm kannst du eine Berechnung starten, wenn alle Eingaben dazu gemacht sind - z.B. wenn der User auf einen Knopf "Berechnen" drückt. Der Nachteil ist, dass dein Programm natürlich nicht mehr auf Eingaben reagiert, bis die Berechnung fertig ist, anderseits stellt sich die Frage, was es in der Zeit denn mit Eingaben anfangen soll. Sinnvoll ist etwa ein Button für "Abbrechen". Um den auszuwerten, kann man in der Schleife für die Berechnung Application.ProcessMessages einfügen und eine Abbruchbedingung abfragen oder einen extra Thread für die Berechnung einrichten.

Wenn es überhaupt nur um eine einzige Funktion geht, etwa eine Ascii-Datei in eine Unicode-Datei umzuwandeln, ist eine Konsolenanwendung garkeine schlechte Idee:


Delphi-Quelltext
1:
2:
3:
4:
writeln ('Moment bitte, ich rechne ...');
MeineRechenFunktion;
writeln ('Fertig! Ergebnisse:');
writeln ( ...

Ist einfach und hat den Scharm der Gründerzeit.

Gruss Reinhard

Nachtrag (editiert, der Vollständigkeit halber):

Main heisst unter Windows WinMain und existiert natürlich auch unter Delphi. Es ist aber nicht vorgesehen, dass WinMain vom Programmierer verändert wird. Die Schleife steckt in "Application.Run". Man kann aber vor oder nach Application.Run in der dpr-Datei norrmalen Programmcode einfügen, wenn das irgendeinen Sinn macht.


delphino - Fr 23.03.07 21:52

Jetzt muß ich nochmals nachhaken. Ein einfaches Beispiel für den Fall, daß etwas außerhalb einer Aktion laufen soll:

Eine Variable soll in einer Endlosschleife immer incrementiert werden. Es gibt ein Button, mit dem der aktuelle Wert der Var. gerade ausgegeben werden kann.

Was ich meine: Wo installiere ich den Zählvorgang. Dieser hängt von keinem Timer und von keiner Aktion ab - er soll "immer" laufen.

Gruß

Wolfgang


mkinzler - Fr 23.03.07 21:58

In diesem Fall würde ich einen Timer verwenden


Karlson - Fr 23.03.07 22:00

Moin!

Da würde der von Ben angesprochene Thread ins Spiel kommen.

In deinem Beispiel würde ich den Thread mit BeginThread erstellen, das würde dann z.B. so aussehen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
public
 wert : integer;

var
 hw, tid : cardinal;

procedure Schleife;

begin
 while true do
  inc(form.wert);
end;


procedure TForm.FormCreate(Sender: Tobject);
begin
 hw:=BeginThread(nil0, @Schleife, nil0, tid);
end;

procedure TForm.ButtonClick(Sender: TObject);
begin
 showmessage(intToStr(wert));
end;

procedure TForm.FormClose;
begin
 TerminateThread(hw, tid);
end;



//edit: Oder natürlich den von mKinzler angesprochenen Timer verwenden.

Rein theoretisch gibt es viele Möglichkeiten.

Auch sowas wäre denkbar:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.ButtonClick(Sender: TObject);
begin
 while true do
  begin
   inc(wert);
   application.ProcessMessages;
  end;
end;