Autor Beitrag
Jakane
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: Di 30.04.13 10:28 
Hallo liebe Delphi-Helfer :)

Ich habe einen Timer der je nach Bedingung von Zeit und Einstellung verschiedene Funktionen startet.
Mein Problem dabei ist, das bei ungünstigen Einstellungen eine Funktion aufgerufen werden müsste, die aber nicht aufgerufen wird, weil die vorherige Funtion noch arbeitet, wärend die Zeit-Bedingung gesetzt ist.

Daher habe ich nun vor diese Funktionen in eine ToDo-Liste zu setzen und diese mit einem seperaten Timer die anfallenden Funktionen abzuarbeiten.

Zum Beispiel der 1. STRING: lbToDo.Items.Strings[0] = '_Funktion(Para1, Para2);'
Es gibt in meinem Projekt auch eine Funktion die genau so aufgerufen wird: _Funktion(Para1, Para2);

Das blöde ist nur, dass die Liste nunmal ein String ist.

Übergangsweise werde ich es wie folgt programmieren:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TfmHaupt.TimerToDoTimer(Sender: TObject);
var
  Funktion : String;
begin
  // Variable initíalisieren
  if lbToDo.Items.Count = 0 then
  begin
    TimerToDo.Enabled:= False;
    EXIT;
  end;
  Funktion:= lbToDo.Items.Strings[0];
  // Funktion starten
  if Funktion = '_Funktion1(Para1, Para2);' then _Funktion1(Para1, Para2);
  if Funktion = '_Funktion1(Para1, Para3);' then _Funktion1(Para1, Para3);
  if Funktion = '_Funktion2(Para4);'        then _Funktion2(Para4);
  ...
end;


Meine Frage:
Gibt es eine Möglichkeit zu sagen, dass der String Funktion direkt als Funktion ausgeführt wird?

Moderiert von user profile iconMartok: Code- durch Delphi-Tags ersetzt
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 30.04.13 11:34 
Das wird nicht funktionieren. Bei parameterlosen Methoden (die je nach Delphi-Version auch noch published sein müssen) könnte man sich ggf. noch mit TMethod behelfen, aber in der Form sehe ich schwarz. Außerdem dürfte damit das Problem auch nicht gelöst sein, da das Programm dann immer noch mit der arbeitenden Routine beschäftigt sein dürfte. Sofern die Routinen nicht auf dieselben Daten zugreifen, könntest Du die Verwendung von Threads ins Auge fassen.
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Di 30.04.13 11:41 
Deine Todoliste nennt man FIFO (First in first out), also praktisch die Supermarktkasse. Wer sich als erstes anstellt, wird auch als erstes bedient. In Delphi gibt es dafür die Klasse TQueue, in der Du eine Liste von Pointern nach dem FIFO-Prinzip speichern kannst. Da könntest Du auch Pointer auf Deine Funktionen speichern. Bzw. Pointer auf Instanzen einer Hilfsklasse die Infos zur Funktion und der Parameter hält.
Ansonsten wäre noch in neuere Delphiversionen die erweiterte RTTI zu nennen, mit der man Funktionen anhand des Namens finden und aufrufen kann.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Jakane Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 257



BeitragVerfasst: Di 30.04.13 12:15 
hmm ok, danke für die Infos :)
muss nachdenken welche ich davon am besten für mich umsetze
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 30.04.13 13:03 
Um welche Delphiversion geht es denn eigentlich? Bei neueren Delphiversionen wäre eine typisierte Liste mit anonymen Funktionen darin eine einfache Lösung.
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 30.04.13 13:26 
Zwar ziemlicher Hardcore, aber mit selbst definierten Messages samt zugehöriger Handler müsste es auch gehen. Die Problematik, dass Routinen ggf. nicht gleichzeitig arbeiten können, wird ohne Threads aber wohl trotzdem bestehen bleiben.