C++ [Qt] Timer erst auf Wunsch starten

MeandXP

Ensign
Registriert
Juli 2009
Beiträge
171
Guten Tach zusammen,

Ich habe vor in einem Programm ab einem bestimmten Zeitpunk die Zeit zu stoppen, und habe dazu QTimer gefunden.
Code:
QTimer *timer = new QTimer(this);
     connect(timer, SIGNAL(timeout()), this, SLOT(update()));
     timer->start(1000);
Der Timer-zeiger wird also angelegt, das entsprechende Signal mit einem Slot verbunden, und dann gestartet. Jetzt würde ich diesen Timer aber gerne erst nach z.B. dem clicked() -Signal eines Button starten, also erst in einem Slot.
Code:
void programm::button_is_clicked() {
        timer->start(1000);
}
Allerdings ist der timer dann natürlich nicht "declared in this scope".

Wie bekomme ich den Timer also auf Wunsch gestartet?

mfg, MeandXP.

P.S: Hoffe das war irgendwie verständlich... :freak:
 
Weiß ja nicht wie das mit QT ist, aber normalerweise hättest du da eh ein Memory leak. Deklarier den Timer als Member von einer Klasse, in dem Fall würde sich wohl programm anbieten.

Code:
class programm {
private:
  QTimer m_Timer;
public:
  programm(void) : m_Timer(NULL) {
    // Constructor
  }
  ~programm(void) {
    // Destructor
    if (m_Timer)
      delete m_Timer;
  }
  void StartTimer(void) {
    if (m_Timer == NULL) {
      m_Timer = new Qtimer(this);
      connect(m_Timer, SIGNAL(timeout()), this, SLOT(update()));
    }
    m_Timer->start(1000); 
  }
};

Und dann:
Code:
void programm::button_is_clicked() {
  StartTimer();
}

I-wie so, oder so ähnlich.

hth Stefan
 
Zuletzt bearbeitet: (timer mit m_Timer ersetzt)
Ist schon ne Weile her, dass ich mit QT gearbeitet habe, aber kannst du nicht das Signal welches der Button auslöst als Start für deinen Timer nehmen. Also, dass du im connect das Signal des Buttons abfängst?
 
Das Problem is doch einfach, dass die Sichtbarkeit von timer nicht passt...

@trillian: Wie du aus dem Teilstück auf Dinge wie Memory Leaks schließen kannst ist beeindruckend...
lassen wir timer ruhig mal nen Zeiger sein, nicht?
 
Ja, liegt eindeutig an der Sichtbarkeit. Du musst den QTimer als Klassenvariable deklarieren.

(Mit memory leaks hat das Ganze allerdings nichts zu tun :p)
 
@FlyingEagle: Gute idee, QTimer hat ja den slot "start()", allerdings hab ich da jetzt n kleinen Fehler drin o.O
Code:
QTimer *prog_time = new QTimer(this);
connect(ui->B_start, SIGNAL(clicked()), this, SLOT(prog_time->start(1000)));
Mr. Compiler meckert "error: expected ‘)’ , got "->" und ich scheine ein grooßes Brett vorm kopf zu haben :D
 
Zuletzt bearbeitet:
MeandXP schrieb:
@FlyingEagle: Gute idee, QTimer hat ja den slot "start()", allerdings hab ich da jetzt n kleinen Fehler drin o.O
Code:
QTimer *prog_time = new QTimer(this);
connect(ui->B_start, SIGNAL(clicked()), this, SLOT(prog_time->start(1000));
Mr. Compiler meckert "error: expected ‘)’ before ‘;’ token" und ich scheine ein grooßes Brett vorm kopf zu haben :D

Autsch, lies bitte nochmal das Tutorial zu Signals & Slots :D
 
Naja ein new ohne delete ergibt normalerweise ein memory leak, natürlich wußte ich nicht ob nicht doch i-wo ein delete ist, daher hast du recht, daß das eine kühne Annahme war :).
 
"Autsch" war mir auch klar, nur der Grund noch nicht.
Ich verweise auf das Brett!
 
Jein :) Bei plain C++ schon, aber Qt's Objekte haben einen Referenzzähler und die Objekte werden von Qt wieder freigegeben, wenn keine Referenz mehr drauf ist.
 
Zum Thema Memory Leak:
Wenn ständig ein neuer Timer gemacht wird ohne den alten freizugeben => Leak
Wenn einmal ein Timer gemacht wird, und dieser nicht freigegeben wird => kein wirkliches Leak
Darum gehts mir halt.

Klar soltle man den Timer auch wieder freigeben, aber was ist, wenn deine program-Klasse dynamisch allokiert wird und nie wieder freigegeben? Da ist doch die selbe Memory-Leak-Gefahr.

Deshalb einfach sagen: Dran denken, den Timer auch freizugeben, wenn er nicht mehr gebraucht wird - wenn es zufällig mit dem Ende des Programms zusammenfällt, braucht man auch nicht unbedingt explizit freigeben...

Das von snow1 gesagte kommt dann noch dazu.
 
@MeandXP:

Von der Form her muss es etwa so aussehen:
Code:
timer->setInterval(1000);
connect(ui->B_start, SIGNAL(clicked()), timer, SLOT(start());

Du hast keinen Slot, sondern einen Methodenaufruf angegeben...
 
Verdammt, hatte da einen "kleinen" dreher drin, jetzt ist mir aber klar was ich falsch gemacht habe! :rolleyes:

Vielen dank für die schnelle Hilfe und Geduld.... xD

mfg, MeandXP.
 
snow1 schrieb:
Jein :) Bei plain C++ schon, aber Qt's Objekte haben einen Referenzzähler

Eben, deswegen schrieb ich auch, "ich weiß ja nicht wie das mit QT ist". Aber das war eh nicht der Punkt, sondern, daß man klarerweise Variablen in dem Scope deklarieren muß, in dem man sie verwendet (wenn man nicht andere Möglichkeiten hat darauf zuzugreifen).
 
Also einen "Referenzzähler" haben Qt-Objekte in der Form definitiv nicht. Was ihr meint, ist daß, wenn das Vaterobjekt zerstört wird, sein Destruktor auch dafür sorgt, daß alle Kinderobjekte zerstört werden. Das ist nicht ganz das gleiche wie ein Referenzzähler.
 
Zurück
Oben