AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Timer=eigener Thread?

Ein Thema von jmd anders · begonnen am 20. Nov 2006 · letzter Beitrag vom 17. Jun 2007
Antwort Antwort
jmd anders

Registriert seit: 13. Mai 2004
84 Beiträge
 
#1

Timer=eigener Thread?

  Alt 20. Nov 2006, 22:20
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
  Mit Zitat antworten Zitat
Benutzerbild von Daniel Schuhmann
Daniel Schuhmann

Registriert seit: 16. Jul 2005
Ort: München
391 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Timer=eigener Thread?

  Alt 20. Nov 2006, 22:22
Nö, ist kein eigener Thread. Der Timer sorgt nur dafür, dass Windows die Nachricht WM_TIMER schickt, auf die dein Programm dann reagiert.
Daniel Schuhmann
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Timer=eigener Thread?

  Alt 20. Nov 2006, 22:26
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Sadum

Registriert seit: 30. Aug 2006
9 Beiträge
 
#4

Re: Timer=eigener Thread?

  Alt 17. Jun 2007, 02:37
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
  Mit Zitat antworten Zitat
Benutzerbild von cruiser
cruiser

Registriert seit: 23. Dez 2003
Ort: Königsbrück/Sachsen
455 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Timer=eigener Thread?

  Alt 17. Jun 2007, 03:06
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Timer=eigener Thread?

  Alt 17. Jun 2007, 03:15
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Sadum

Registriert seit: 30. Aug 2006
9 Beiträge
 
#7

Re: Timer=eigener Thread?

  Alt 17. Jun 2007, 03:21
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.
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#8

Re: Timer=eigener Thread?

  Alt 17. Jun 2007, 03:23
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
  Mit Zitat antworten Zitat
Sadum

Registriert seit: 30. Aug 2006
9 Beiträge
 
#9

Re: Timer=eigener Thread?

  Alt 17. Jun 2007, 03:50
Vielen Dank für die ausführliche Antwort (und das noch zu so später Stunde) ! - 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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:10 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