Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Threads mit TTimer simulieren? (https://www.delphipraxis.net/39297-threads-mit-ttimer-simulieren.html)

tata1 31. Jan 2005 16:12


Threads mit TTimer simulieren?
 
Hi.
Ich habe hier eine feste Anzahl (20) von Dingen, die mein Programm gleichzeitig ausführen sollte (weils nacheinander zu lange dauert).
Da für diese Aufgabe Threads viel zu kompliziert sind, habe ich mir gedacht, ich kann das bestimmt mit Timern auch machen.
Also 20 Timer auf das Form geklatscht und in einem ButtonClick einfach alle auch Enabled gesetzt.
Funktioniert - wird alles gleichzeitig gemacht...

Jetzt würde ich das gern zur Laufzeit machen. Dh. zur Laufzeit genug Timer Objekte erstellen und denen jeweils die Aufgabe geben.
Im Prinzip soll jedes Timer-Objekt das selbe machen, nur eine Variable ändert sich.

Jetzt versuche ich schon die ganze Zeit das folgendermaén zu machen:
Code:
tmp:TTimer;
...
tmp := TTimer.create(nil);
tmp.intervall := 30000;
tmp.ontimer := ...
ja - hier ist schluss... Ich würde gerne eine Prozedur einfügen, die ich oben defniniert habe.
Code:
procedure Tudas(parameter:integer);
begin
 tus....
end;
und dann tmp.ontimer := tudas(1); sagen.

Aber das will nicht. Ich weiß, dass ich die Prozedur irgendwie als TNotifyEvent typen muss, aber das will Delphi auch nicht...

Weiß da jemand Rat?

Gruß
Jörn

jfheins 31. Jan 2005 16:17

Re: Threads mit TTimer simulieren?
 
Der timer bracht ein TNotifyEvent, das muss also von einem Objekt sein. Aber dann kannst du statt TTimer auch einfach TThread nehmen ...


Thread-Beispiel:
Delphi-Quellcode:
TMyThread = class(TThread)
  protected
    procedure Execute; override;
end;

var
 MeinThread: TMyThread;

implementation

procedure TMyThread.Execute;
begin
Beep;
sleep (5000);
beep;
end;
Und dann irgendwo
Delphi-Quellcode:
MeinThread := TMyThread.Create (TRUE);
MeinThread.FreeOnTerminate := TRUE;
MeinThread.Resume;

Minz 31. Jan 2005 16:18

Re: Threads mit TTimer simulieren?
 
du könntest eine neue Klasse vom Typ TTimer erzeugen

TOwnTimer = class(TTimer)

darin definierst du die Prozedur als Methode

fertig !

tata1 31. Jan 2005 16:42

Re: Threads mit TTimer simulieren?
 
Also wenn ich das so betrachte...
So funktionieren Threads? Das ist ja (relativ) einfach...

Da ist mein ganzes rum-ge-Timere viel umständlicher...

Ich hab mich nie so richtig an Threads rangetraut :duck: aber ich werde mal weiter schauen. :bounce2:


PS: Ich habs mal mit Threads probiert - es klappt.
Ich muss jetzt nur noch aufpassen, dass die einzelnen Threads nicht das gleiche machen, sondern jeder seinen Teil.
Ich werd mal schauen, ob ich das hinbekomme - eigentlich muss ich nur einen Wert in den Thread reinstecken, bevor er losgelassen wird...
Da kann ich doch einfach ne public-Variable in dem Thread definieren und der bevor ich den Thread starte, einen Wert zuweisen, oder?

PPS: Daaanke :)

shmia 31. Jan 2005 16:43

Re: Threads mit TTimer simulieren?
 
Zitat:

Zitat von tata1
Ich habe hier eine feste Anzahl (20) von Dingen, die mein Programm gleichzeitig ausführen sollte (weils nacheinander zu lange dauert).
Da für diese Aufgabe Threads viel zu kompliziert sind, habe ich mir gedacht, ich kann das bestimmt mit Timern auch machen.
Also 20 Timer auf das Form geklatscht und in einem ButtonClick einfach alle auch Enabled gesetzt.

Ich finde das keine gute Idee!!!
Also: Threads machen dann Sinn, wenn die Aufgaben, die zu erledigen sind immer wieder
Wartezeiten aufweisen (weil z.B. eine Datei übers Internet downgeloaded wird oder
auf Daten der seriellen Schnittstelle gewartet wird)
Wenn du 20 Apfelmännchenbilder rechnen willst, dann wird es mit Threads länger dauern
als wenn du alles nacheinander durchführst.

Wenn du nun versuchst, die Threads mit Timer nachzubilden, wird die ganze Sache noch langsamer als mit Threads werden.
Effektiv hast du nur einen Programmfaden;
wenn ein Timer nicht zurückkommt, weil in OnTimer noch gearbeitet wird, laufen die anderen Timer nicht weiter.

Haben deine 20 Dinge Wartezeiten, dann nimm Threads; sind keine Wartezeiten zu erwarten
dann arbeite alles nacheinander ab!

tata1 31. Jan 2005 16:55

Re: Threads mit TTimer simulieren?
 
[quote="shmia"]
Zitat:

Zitat von tata1
Also: Threads machen dann Sinn, wenn die Aufgaben, die zu erledigen sind immer wieder
Wartezeiten aufweisen (weil z.B. eine Datei übers Internet downgeloaded wird oder
auf Daten der seriellen Schnittstelle gewartet wird)

Sind böse Wartezeiten dabei :)

Danke! Das hat mich jetzt in meinem -Ich mach das jetzt mit Threads- Gedanken bestärkt...


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz