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
delphino 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(nil, 0, @Schleife, nil, 0, 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; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!