Timer-Frage
-
Hallo zusammen,
ich habe eine Frage zur TTimer Klasse:
ähm, wenn ich einem Timer sage Timer1->Enabled=true und er einen Interval von 10ms hat, wird dann ein neuer Task gestartet? Oder passiert das einfach in einem eigenen Thread? Oder nichts von beidem?
Und was passiert wenn ich Timer1->Enabled=false mache und dann delete TKlasseA gleich anhänge und TKlasseA wird in der TTimerTimer-Funktion benutzt, passiert dann ein Fehler oder wird TTimer sofort gestoppt?
Danke!
-
Was willst du mit dem Timer genau erreichen? Hört sich arg nach würg an die Frage.
Um deine Fragen zu beantworten: TTimer empfängt bei einem Interval von 10ms alle 10ms (nicht wirklich präzise) eine Nachricht WM_TIMER. Diese wird in der Nachrichtenbehandlungsroutine ausgewertet und der entsprechende Wert aufgerufen. Während dieser Zeit wir in dieser nachrichtenbearbeitungsschleife nichts weiter gemacht. Es handelt sich also nicht um Multi-Threading. Das musst du scon selbst mit TThread irgendwie implementieren.
Was das Löschen von Objekten in der Timerfunktion betrifft (hier vermute ich den Würg) so bist du allein verantwortlich, was da passiert. In der Regel bist du als Programmierer dafür verantwortlich, sicher zu stellen, dass du nicht anderen Funktionen das Objekt "unterm Hintern wegziehst".
-junix
-
-
wird im Destruktor KillTimer aufgerufen?
-
Hi,
so sieht die Funktion aus, die ständig aufgerufen wird:
procedure TTimer.UpdateTimer; begin KillTimer(FWindowHandle, 1); if (FInterval <> 0) and FEnabled and Assigned(FOnTimer) then if SetTimer(FWindowHandle, 1, FInterval, nil) = 0 then raise EOutOfResources.Create(SNoTimers); end;
im destruktor wird dieses auch aufgerufen.
-
????? schrieb:
wird im Destruktor KillTimer aufgerufen?
Nein, bis jetzt nicht, aber wie krieg ich die Parameter für die Funktion zusammen?
The KillTimer function destroys the specified timer.
BOOL KillTimer(
HWND hWnd, // handle of window that installed timer
UINT uIDEvent // timer identifier
);Parameters
hWnd
Identifies the window associated with the specified timer. This value must be the same as the hWnd value passed to the SetTimer function that created the timer.
uIDEvent
Specifies the timer to be destroyed. If the window handle passed to SetTimer is valid, this parameter must be the same as the uIDEvent value passed to SetTimer. If the application calls SetTimer with hWnd set to NULL, this parameter must be the timer identifier returned by SetTimer.
-
AndreasW schrieb:
Hi,
so sieht die Funktion aus, die ständig aufgerufen wird:
procedure TTimer.UpdateTimer; begin KillTimer(FWindowHandle, 1); if (FInterval <> 0) and FEnabled and Assigned(FOnTimer) then if SetTimer(FWindowHandle, 1, FInterval, nil) = 0 then raise EOutOfResources.Create(SNoTimers); end;
im destruktor wird dieses auch aufgerufen.
In welchem Destruktor?
-
Ups, war eine Frage an die den Quellcode der VCL besitzen.
Ich wollte wissen ob KillTimer im Destruktor von TTimer aufgerufen wird.
-
????? schrieb:
Ups, war eine Frage an die den Quellcode der VCL besitzen.
Ich wollte wissen ob KillTimer im Destruktor von TTimer aufgerufen wird.
aha Okay...
-
wie geasagt,
indirekt, da der destruktor FInterval auf 0 setzt und dann UpdateTimer aufruft.
In UpdateTimer wird KillTimer aufgerufen. Da FInterval nun 0 ist wird aber kein SetTimer mehr aufgerufen.
-
Also, um etwas konkreter zu werden:
in meinem OnClose() vom Main_Frm hab' ich das da:Timer1->Enabled=false; delete Profi_p; Profi_p=NULL;
und ich hatte angst, dass ich Profi_p zerstöre während das Timer1-zeugs noch am laufen ist, denn in der Funktion Timer1Timer() werden mehrfach Methoden der Klasse Profi_p aufgerufen.