Autor Beitrag
delphino
Hält's aus hier
Beiträge: 6



BeitragVerfasst: So 21.01.07 19:51 
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: So 21.01.07 22:07 
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:

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Fr 23.03.07 21:58 
In diesem Fall würde ich einen Timer verwenden

_________________
Markus Kinzler.
Karlson
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 2088



BeitragVerfasst: 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:

ausblenden 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:

ausblenden 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;