Singleton benötigt?
Verfasst: 10. Januar 2007 17:45
Hallo mal wieder,
bei meinem kleinen Programm tut sich ein anderes Problemchen auf. Ich habe vier RadioButtons, über die man den Wert für einen Timer angeben kann. Mit einem PushButton ("Start") wird dann der Timer gestartet und die ProgressBar läuft auch wie gewünscht ab.
Jetzt passiert es aber, dass die ProgressBar schneller wird, wenn der Benutzer -- während ein Timer gerade läuft -- mit einer RadioButton Auswahl und dem Start Knopf einen neuen Timer startet. Zwar wird die ProgressBar ordnungsgemäß zurückgesetzt, aber sie läuft immer schneller ab.
Die Vermutung ist, dass immer mehr Timer gestartet werden, die alle den Wert der Klassenvariablen progress erhöhen. Das würde bedeuten ich bräuchte sowas wie ein Singleton meines Timers, oder?!
Der Codeabschnitt sieht wie folgt aus:
Wie würde man da am geschicktesten vorgehen? Müsste man jetzt das Objekt static deklarieren? Wie geht das dann mit dem connect Aufruf? Oder geht das ganze auch einfacher auf anderem Wege?
bei meinem kleinen Programm tut sich ein anderes Problemchen auf. Ich habe vier RadioButtons, über die man den Wert für einen Timer angeben kann. Mit einem PushButton ("Start") wird dann der Timer gestartet und die ProgressBar läuft auch wie gewünscht ab.
Jetzt passiert es aber, dass die ProgressBar schneller wird, wenn der Benutzer -- während ein Timer gerade läuft -- mit einer RadioButton Auswahl und dem Start Knopf einen neuen Timer startet. Zwar wird die ProgressBar ordnungsgemäß zurückgesetzt, aber sie läuft immer schneller ab.
Die Vermutung ist, dass immer mehr Timer gestartet werden, die alle den Wert der Klassenvariablen progress erhöhen. Das würde bedeuten ich bräuchte sowas wie ein Singleton meines Timers, oder?!
Der Codeabschnitt sieht wie folgt aus:
Code: Alles auswählen
void Dialog::setProgressBar()
{
progress += progressStep;
progressBar->setValue(static_cast<int>(progress));
}
void Dialog::startTimer()
{
// Check which radio button was selected
if (radioButton_1->isChecked())
seconds = (timeEdit->time().minute() * 60) + timeEdit->time().second();
else if (radioButton_2->isChecked())
seconds = 180;
else if (radioButton_3->isChecked())
seconds = 300;
else if (radioButton_4->isChecked())
seconds = 420;
progress = 0; // current progress in percentage
progressStep = 100.0 / seconds; // how many percent correspond to one second
std::cout << "seconds " << seconds << std::endl;
std::cout << "progressStep " << progressStep << std::endl;
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(setProgressBar()));
timer->start(1000);
}