Funktionen mit Timer
-
Naja das Problem ist, das ich noch keine Funktionen selbst gemacht habe.... Ich möchte den Quelltext etwas abkürzen, da ansonsten das Timerereignis der 7 Timer sich auf die Übersichtlichkeit im Text auswirkt.
MfG
-
Weis den anderen Timern doch im jeweiligen Ereignis die gleiche Funktion zu.
Dann fragst du über den Sender ab welcher Timer es ist, machst deine Berechnung und schreibst es in das jeweilige Panel. (ich geh mal davon aus, dass jeder Timer die gleiche Aufgabe hat)
-
Ich habe jetzt dem Timer2 - Timer8 die Ereignisse von Timer2Timer zugewiesen... Wie kann ich jetzt den Sender von den jeweiligen Timern abfragen???
Sorry aber ich bin noch nicht solange beim c++ programmieren!!
MfG
-
if (Sender == Timer2) ShowMessage("Timer2 wars...");
-
Benutzt du die Timer nur zur Zeitmessung!? Das macht man üblicherweise auf direktem Weg.
int start = time(0); ZeitaufwendigeFunktion(); int ende = time(0); int dauer = ende - start;
Das muss dann natürlich noch nach Bedarf in Minuten und Stunden umgerechnet werden, aber das ist ja nur noch Mathematik. Für Messungen im Millisekundenbereich kannst du statt time() zB. GetTickCount verwenden.
-
Soweit sogut
Jetzt kann ich die Zeiten in die jeweiligen Panels ausgeben. Wenn der Timer2 läuft und ich den Timer 3 starte, fängt timer2 wieder bei 0 an und beide Timer arbeiten im 2 sekunden takt. gibt es dafür eine erklärung???
void __fastcall TForm1::Timer2Timer(TObject *Sender) { second = second + 1; if (second == 60) { second = 0; minute = minute + 1; if (minute == 60) { minute = 0; hour = hour + 1; } } ssecond = IntToStr(second); sminute = IntToStr(minute); shour = IntToStr(hour); if (ssecond.Length() == 1) ssecond = "0"+ssecond; if (sminute.Length() == 1) sminute = "0"+sminute; if (shour.Length() == 1) shour = "0"+shour; if (Sender == Timer2) Panel10->Caption = "Zeit: "+shour+":"+sminute+":"+ssecond; if (Sender == Timer3) Panel11->Caption = "Zeit: "+shour+":"+sminute+":"+ssecond; if (Sender == Timer4) Panel12->Caption = "Zeit: "+shour+":"+sminute+":"+ssecond; if (Sender == Timer5) Panel13->Caption = "Zeit: "+shour+":"+sminute+":"+ssecond; if (Sender == Timer6) Panel14->Caption = "Zeit: "+shour+":"+sminute+":"+ssecond; if (Sender == Timer7) Panel15->Caption = "Zeit: "+shour+":"+sminute+":"+ssecond; if (Sender == Timer8) Panel16->Caption = "Zeit: "+shour+":"+sminute+":"+ssecond; }
[ Dieser Beitrag wurde am 10.07.2003 um 17:43 Uhr von Jansen editiert. ]
-
Original erstellt von <Linuxguru>:
**Soweit sogutJetzt kann ich die Zeiten in die jeweiligen Panels ausgeben. Wenn der Timer2 läuft und ich den Timer 3 starte, fängt timer2 wieder bei 0 an und beide Timer arbeiten im 2 sekunden takt. gibt es dafür eine erklärung???
**
Jo, Du nimmst ja fuer alle Timer die gleiche Variable second!!!
-
Auf die Gefahr hin, dass ich hier weiterhin ignoriert werde
mal ein Vorschlag, der mit einem Timer auskommt und trotzdem das ermöglicht, was Linuxguru erreichen will (falls ich ihn richtig verstanden habe
).
Benötigt werden ein Button, eine StatusBar, ein Timer (Intervall zB. 50) und ein der StatusBar zugeordnetes Popup-Menü mit einem Item namens MenuStop.
Per Buttonklick wird jeweils ein neuer "virtueller Timer" erzeugt und in der Statusbar angezeigt. Per Rechtsklick in der StatusBar kann der jeweilige "Timer" beendet werden. Die Verwaltung der "Timer" wird mit std::vector als dynamischem Array realisiert.
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" #include <vector> using namespace std; vector<long> counter; // dynamisches Array von "virtuellen Timern" TForm1 *Form1; //--------------------------------------------------------------------------- String AddZero(String str) { // Hilfsfunktion, füllt einstellige "Zahlen" mit führender Null auf if (str.Length() == 1) str = "0" + str; return str; } //--------------------------------------------------------------------------- String FormatTimeDisplay(long seconds) { // Hilfsfunktion, wandelt Sekundenwert in '00:00:00' um return AddZero(seconds / 3600) + ":" + // hour AddZero((seconds % 3600) / 60) + ":" + // min AddZero((seconds % 3600) % 60); // sec } //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { // Array um neuen Counter erweitern counter.push_back(0); counter[counter.size()-1] = 0; // neues StatusBar-Panel anlegen TStatusPanel *panel = StatusBar1->Panels->Add(); panel->Text = FormatTimeDisplay(counter[counter.size()-1]); } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { if (counter.size() > 0) { // alle Counter inkrementieren ... for (unsigned int i = 0; i < counter.size(); i++) { counter[i]++; // ... wenn volle Sekunde, die neuen Werte ausgeben int var = 1000 / Timer1->Interval; if (!(counter[i] % var)) StatusBar1->Panels->Items[i]->Text = FormatTimeDisplay(counter[i] / var); } } } //--------------------------------------------------------------------------- void __fastcall TForm1::StatusBar1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if (Button == mbRight) { // prüfen, in welchem Panel sich die Maus befindet... int addwidth = 0; for (int i = 0; i < StatusBar1->Panels->Count; i++) { addwidth += StatusBar1->Panels->Items[i]->Width; if (X < addwidth) { // ... und Menü-Item anpassen MenuStop->Caption = "Kill Timer" + String(i+1); MenuStop->Tag = i; break; } } } } //--------------------------------------------------------------------------- void __fastcall TForm1::MenuStopClick(TObject *Sender) { // selektierten Counter löschen, entsprechendes Panel löschen counter.erase(counter.begin() + MenuStop->Tag); StatusBar1->Panels->Delete(MenuStop->Tag); }//---------------------------------------------------------------------------
[ Dieser Beitrag wurde am 11.07.2003 um 01:10 Uhr von Jansen editiert. ]
-
Aber wenn du in jedem Timer die gleichen Variablen benutzt gibt das doch probleme, oder? (wenn sie dann gleichzeitig laufen)
[ Dieser Beitrag wurde am 11.07.2003 um 09:12 Uhr von Thargor editiert. ]
-
Jo Jansen
Genau so sollte es werden. Hab es mal nachgebaut.... Leider versteh ich von Arrays noch sehr wenig... Werde mich wohl erst ein wenig belesen und dann das ganze mal Stück für Stück durcharbeiten.
Dank dir!!!