Timer mit Ereignis synchonisieren.
-
Da bei Sleep(1000); immer das Programm einfriert, wollte ich stattdessen einen Timer einfügen.
Das Problem ist jetzt, dass der Timer immer unabhängig von den anderen Codezeilen taktet.
Kann man es irgendwie hinkriegen den Timer zu synchronisieren?
Ich hab das zuerst so gelöst:
void __fastcall TClient::Timer1Timer(TObject *Sender) { if(CountTimer == TIMER) { //Code CountTimer = 0; } CountTimer++; }Bei den Ereignissen wird dann entsprechend CountTimer = 0; gemacht.
Aber irgendwie ist das nicht das richtige.
Die Intervalle müssten dann besonders klein sein um eine bessere Synchronisation zu haben und dies führt wieder zu mehr ungenauigkeit, da TTimer ereignisgesteuert ist.
-
Hallo
Tobi3000 schrieb:
Da bei Sleep(1000); immer das Programm einfriert, wollte ich stattdessen einen Timer einfügen.
Das Problem ist jetzt, dass der Timer immer unabhängig von den anderen Codezeilen taktet.
Was willst du denn noch? Entweder dein Programm wartet eine Sekunde und führt dann eine Aktion aus (sleep) oder dein Programm führt in einer Sekunde eine Aktion aus und wartet nicht darauf (TTimer).Und "irgendwie nicht das richtige" ist auch keine ausreichende Problembeschreibung.
bis bald
akari
-
Mit Sleep(1000); meinte ich ein
while(Bedingung) { //Code Sleep(1000); }Dies ist einfach keine richtige Lösung, weil das Programm dabei einfriert und darum hab ich Timer genommen.
Und warum meine Lösung nicht das Richtige ist, hab ich doch einen Satz später geschrieben.
Wenn ich den Intervall zu klein mache, dann ist er wieder zu langsam und wenn ich ihn zu groß mache, dann hab ich einen zu großen Delay.Optimal ist es, wenn der Timer bei einem sofort auf 0 gesetzt wird bei einem bestimmten Ereignis und der Intervall = 1000 ist.
-
Such mal nach Application->ProcessMessages()...
-
OK Ich hab das Problem jetzt gelöst.
Ich hab in der Hilfe zufällig gefunden, dass wenn der (das ?) Interval auf 0 gesetzt ist, dass ich den Timer praktisch abschalte.
Durch Rumexperimentieren hab ich herausgefunden, dass bei der Anweisung Interval = 0; der Timer auch resettet wird.Das heißt also synchronisieren kann man mit:
Timer1->Interval = 0; Timer1->Interval = 1000;Jetzt ist das Problem, dass die Funktion erst nach einer Sekunde ausgeführt wird und nicht gleich sofort.
Dies löst man dann indem man Timer1Timer(0); davor setzt.
-
Äh... Warum so umständlich? Schau mal in der Hilfe nach TTimer::Enabled.
Und wie Th schon meinte, scheint mir ProcessMessages in Verbindung mit while und sleep die bessere Wahl zu sein.