Timer
-
Guten Morgen
Ich habe ein Probelm mit einem Timer.
Ich verwende den Timer vom Borland mit einem Intervall, welches einstellbar ist.
Im Programm muss ich immer nach dem Intervall einen Teil ausführen.
Dies soll aber erst geschehen, wenn ich auf einen Button geklickt habe.
Im Detail seht dieser Programmteil so aus:void __fastcall TForm1::Messungstarten1Click(TObject *Sender) { if (verbindung == 1) { while(wiederholung>zahler) { t1 = rand()%40; t2 = rand()%40; t3 = rand()%40; t4 = rand()%40; Sensor1->Text = IntToStr(t1)+" °Celsius"; Sensor2->Text = IntToStr(t2)+" °Celsius"; Sensor3->Text = IntToStr(t3)+" °Celsius"; Sensor4->Text = IntToStr(t4)+" °Celsius"; TDateTime t=Time(); TDateTime d=Date(); zahler ++; counter++; Sleep(Timer2->Interval); if(counter<10) { if(t1<10) Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 1 "+Sensor1->Text+" "+d+" "+t); else Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 1 "+Sensor1->Text+" "+d+" "+t); if(t2<10) Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 2 "+Sensor2->Text+" "+d+" "+t); else Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 2 "+Sensor2->Text+" "+d+" "+t); if(t3<10) Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 3 "+Sensor3->Text+" "+d+" "+t); else Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 3 "+Sensor3->Text+" "+d+" "+t); if(t4<10) Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 4 "+Sensor4->Text+" "+d+" "+t); else Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 4 "+Sensor4->Text+" "+d+" "+t); Memo1->Lines->Add(""); } else if(counter<100) { if(t1<10) Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 1 "+Sensor1->Text+" "+d+" "+t); else Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 1 "+Sensor1->Text+" "+d+" "+t); if(t2<10) Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 2 "+Sensor2->Text+" "+d+" "+t); else Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 2 "+Sensor2->Text+" "+d+" "+t); if(t3<10) Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 3 "+Sensor3->Text+" "+d+" "+t); else Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 3 "+Sensor3->Text+" "+d+" "+t); if(t4<10) Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 4 "+Sensor4->Text+" "+d+" "+t); else Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 4 "+Sensor4->Text+" "+d+" "+t); Memo1->Lines->Add(""); } else { if(t1<10) Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 1 "+Sensor1->Text+" "+d+" "+t); else Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 1 "+Sensor1->Text+" "+d+" "+t); if(t2<10) Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 2 "+Sensor2->Text+" "+d+" "+t); else Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 2 "+Sensor2->Text+" "+d+" "+t); if(t3<10) Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 3 "+Sensor3->Text+" "+d+" "+t); else Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 3 "+Sensor3->Text+" "+d+" "+t); if(t4<10) Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 4 "+Sensor4->Text+" "+d+" "+t); else Memo1->Lines->Add(" "+IntToStr(counter) + " Sensor 4 "+Sensor4->Text+" "+d+" "+t); Memo1->Lines->Add(""); } } zahler = 0; } else ShowMessage("Keine Konnektivität!"); }Momentan mache ich es jetzt noch mit Sleep, dann ist aber das gesamte Programm blockiert!
Und das will ich genau vermeiden!
Ich hoffe ihr könnt mir helfen.Gruss
Jürg Schweizer
-
C++ kennt keine Timer, da mußt du dich also in deinem System umsehen nach Funktionen wie SetTimer() oder StartTimer() (bin mir nicht ganz sicher, wie die heißt). So ein Timer erzeugt idR eine "normale" Systemnachricht, die du genauso behandeln könntest wie z.B. Button-Clicks oder Mausbewegungen.
-
Erstmal kurze Frage: ist das Absicht, dass bei allen deinen Fällen das gleiche passiert oder hab ich mich da einfach verguckt?
Zu deiner eigentlich Frage: soll es so ablaufen, dass der Timer eine Art Interrupt auslöst und dann ein Knopf angezeigt wird, den der Benutzer anklicken kann?
-
Hallo
Zunächst gehört das ins Builder-Subforum.
Desweiteren must du den Quellcode schon stark verändern bis der von dir gewünschte Effekt eintritt. Schau in der Builder-Hilfe nach der Eigenschaft TTimer::Enabled und dem Event TTimer::OnTimer.
Desweiteren solltest du die ganzen Behandlungen für die einzelnen Sensoren anstatt jeweils einzeln besser in einer Schleife mit Array-Unterstützung umsetzen.bis bald
akari
-
Danke für eure Antworten.
Dass man es kürzer machen könnte, bin ich mir bewusst, aber ich bin absolut neu in C++.Das mit em Timer ist folgendes:
Wenn ich auf den Button Blicke, soll es in Abständen diesen Programmteil in der Whileschleiche Durchführen.
Ich hoffe, es ist so verständlicher geschrieben.
-
Hallo
akari schrieb:
Schau in der Builder-Hilfe nach der Eigenschaft TTimer::Enabled und dem Event TTimer::OnTimer.
bis bald
akari
-
in klartext, du legst dir eine Methode an von der Struktur
void __fastcall MyTimerEvent(TObject *Sender);wenn du dann deinem Timer im ctor einfach
Timer->OnTimer = MyTimerEvent;setzt, wird dein TimerEvent immer nach dem mit Interval angegebenen Wert ausgeführt.
Der Timer blockiert dabei überhauptnichts, wenn die Zeit gekommen ist, wird der Programmablauf "unterbochen" und das Event bearbeitet, vorausgesetzt du hast nicht irgendwo eine Endlosschleife laufen.
Und jetzt der einfache weg, wenn du eine FormularAnwendung gemacht hast, klicke im design doch einfach auf deinen Timer, gehe zu den "Ereignissen" im Objektinspektor und doppelklicke in das Feld für "OnTimer" vielleicht ersparst du dir damit schreibarbeit.
falls hier irgendwas zynisch ironisch oder wie n seitenhieb anhört bitte ich das zu entschuldigen ;p
[EDIT] Im Objektinspektor kannst du auch Timer->Enabled = false; setzen damit dein Timer nicht sofort anschlägt.
In der OnExecute deines Button kannst du dann einfach Timer->Enabled = !Timer->Enabled; ausführen um den Timer zu toggeln.
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum VCL/CLX (Borland C++ Builder) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.