Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Timer=eigener Thread? (https://www.delphipraxis.net/81091-timer%3Deigener-thread.html)

jmd anders 20. Nov 2006 21:20


Timer=eigener Thread?
 
Hallo zusammen, ich wollte mich nur mal eben darüber informieren, ob jeder Timer auch gleichzeitig einen eigenen thread erzeugt und der code darin threadsafe sein muss.
oder wie funktioniert der standard delphi timer?

danke :)

Daniel Schuhmann 20. Nov 2006 21:22

Re: Timer=eigener Thread?
 
Nö, ist kein eigener Thread. Der Timer sorgt nur dafür, dass Windows die Nachricht WM_TIMER schickt, auf die dein Programm dann reagiert.

SirThornberry 20. Nov 2006 21:26

Re: Timer=eigener Thread?
 
Der Timer funktioniert nach dem gleichen Prinzip wie ein Button-Click. Wenn du auf einen Button klickst wird eine Message geschickt und dein Quelltext wird aufgerufen. Der Timer schickt in einem Interval eine Nachricht welche dann dafür sorgt das dein Quelltext abgearbeitet wird.

Sadum 17. Jun 2007 01:37

Re: Timer=eigener Thread?
 
Damit ist die Frage nach dem "Threadsafe" aber nicht wirklich beantwortet, denn soweit ich weiß werden Timer doch zumindest "abwechselnd" und nicht nacheinander ausgeführt oder?
Kurz: Was ist wenn ich 2 Timer habe, die zeitgleich 2 Codeabschnitte starten (oder sozusagen "auf 2 Buttons gleichzeigt drücke"), welche z.B. beide ein array von 2000 Elementen überschreiben? Kann es dann sein, dass 1000 Elemente die Werte von Timer1 enthalten und 1000 die Werte von Timer2, oder werden Timer intern nacheinander ausgeführt?

EDIT: Ok, Timer scheinen doch intern nacheinander abgearbeitet zu werden.
Habe schnell einen kleinen "Versuch" mit 2 sehr rechenintensiven Timern gestartet, die beide durch einen Button aktiviert werden - seltsamerweise wurde bei:

Timer1.Enabled := true;
Timer2.Enabled := true;

Timer2 zuerst abgearbeitet und danach Timer1, wobei Timer1 doch eigentlich ein paar Taktzyklen früher gestartet wurde :?

cruiser 17. Jun 2007 02:06

Re: Timer=eigener Thread?
 
Da das Programm nichts weiter als eine extrem verzweigte Dauerschleife ist (*g* steinigt mich) sollte es nicht möglich sein, dass 2 Timer-Events zeitgleich auf die daten zugreifen.

Luckie 17. Jun 2007 02:15

Re: Timer=eigener Thread?
 
Zitat:

Zitat von cruiser
dass 2 Timer-Events zeitgleich auf die daten zugreifen.

Wie soll das gehen? Mit einer Hand (eine CPU) kannst du auch immer nur ein Bierglas nach dem anderen in die Hand nehmen. Eine CPU kann auch immer nur eine Anweisung nach der anderen ausführen. Und wenn man zwei CPUs hat, müsste man beide Timer in verschiedenen Threads laufen lassen, um etwas "zeitgleich" ausführen zu können.

Sadum 17. Jun 2007 02:21

Re: Timer=eigener Thread?
 
Ich dachte da vorhin eher an abwechselnd, statt zeitgleich (was ja in einem Thread nicht möglich ist). Also jeder Timer bekommt garantiert ab und an ein bisschen CPU-Zeit zugesprochen.

Reinhard Kern 17. Jun 2007 02:23

Re: Timer=eigener Thread?
 
Zitat:

Zitat von Sadum
Damit ist die Frage nach dem "Threadsafe" aber nicht wirklich beantwortet, denn soweit ich weiß werden Timer doch zumindest "abwechselnd" und nicht nacheinander ausgeführt oder?
Kurz: Was ist wenn ich 2 Timer habe, die zeitgleich 2 Codeabschnitte starten (oder sozusagen "auf 2 Buttons gleichzeigt drücke"), welche z.B. beide ein array von 2000 Elementen überschreiben? Kann es dann sein, dass 1000 Elemente die Werte von Timer1 enthalten und 1000 die Werte von Timer2, oder werden Timer intern nacheinander ausgeführt?

Hallo,

die Probleme sind schon ähnlich wie bei Threads - das gilt allerdings für das gesamte Windows-Meldungs-System. Du kannst ja auch z.B. 2 mal kurz nacheinander den Befehl "Datei laden" geben, dann wird ein 2. Ladevorgang gestartet, obwohl er erste noch nicht beendet ist. Ob das funktioniert oder nicht, hängt vom genauen Ablauf ab: kann sein, die Ladeprozedur blockiert die Message Loop, dann kommt der 2. Befehl erst an, wenn der erste abgearbeitet ist, gibt es dagegen irgendwo ein ProcessMessages, dann platzt er mittenrein. Zur Abhilfe muss man z.B. den Menuepunkt "Laden" deaktivieren, solange eine Ladefunktion läuft, oder in der Funktion Semaphore oder Mutexe verwenden, es gibt viele Möglichkeiten.

Beim Timer kommt noch dazu, dass er nicht mit dem Rest synchronisiert ist, eine Timermessage kann also zu jedem beliebigen Zeitpunkt auftreten, das ist schon so was ähnliches wie ein Pseudothread. Man muss also nach den Regeln der nebenläufigen Programmierung arbeiten, z.B. dürfen Variable, die im Hauptprogramm und in der Timerroutine verwendet werden, nur von einem der beiden Programmteile geschrieben werden, und wenn mehrere solche Variable zusammenhängen, muss man beim Schreiben so etwas wie eine Critical Section einrichten.

Das beantwortet auch deine letzte Frage: wenn ein Timer einen anderen unterbrechen kann, gibts ohne Gegenmassnahmen Datensalat.

Gruss Reinhard

Sadum 17. Jun 2007 02:50

Re: Timer=eigener Thread?
 
Vielen Dank für die ausführliche Antwort (und das noch zu so später Stunde) :hi: ! - Ich habe auch gerade gemerkt, dass ich meine beiden "Test-Timer" mit "Application.ProcessMessages;" doch dazu überreden konnte nebeneinander zu arbeiten. Also ist das Ganze letztendlich doch nicht threadsafe :(


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:13 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