[Qt 4] Problem mit QTimer
-
Hy,
in meinem Timer mit 2000 ms Intervall steht folgender Code:
QFile test("test.txt"); test.open(QIODevice::ReadOnly| QIODevice::Text); QTextStream in(&test); QStringList tempList; while (!in.atEnd()) { tempList<<in.readLine(); } for (int i=0;i<=list2.size();i++) { if (!tempList.contains(list2.at(i)))list2.removeAt(i); }
Doch jedesmal stürzt das Programm ab, wenn der Timer das ertse Mal gstartet wurde. Es beendet sich einfach? Warum??
-
"in deinem Timer" Hast du QTimer gesubclasst? ich mach das immer so, dass ich den timer mit einem anderen slot verbinde...
-
1. Ich glaub das ist zu wenig Code, um den Fehler zu finden..
2. Wie beendet sich das Programm? Seg Fault?
3. Gibt open() true zurueck?
4. Bis wo laeuft der Code (herauszufinden mit dem Debugger oder mit couts)?
-
Also, hier die erweiterte Version:
(Bool b=true, also open gibt true zurück!)
// steht im Konstruktor des Progs QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(read())); timer->start(2000);
} void Form::read() { QMessageBox::information(0,"Information","Beginn",QMessageBox::Ok,0,0); QFile test("test.txt"); bool b=test.open(QIODevice::ReadOnly| QIODevice::Text); QTextStream in(&test); QMessageBox::information(0,"Information","Test1 Bool: "+QString::number(b),QMessageBox::Ok,0,0); QStringList tempList; while (!in.atEnd()) { tempList<<in.readLine(); } QMessageBox::information(0,"Information","Test2",QMessageBox::Ok,0,0); for (int i=0;i<=list2.size();i++) { if (!tempList.contains(list2.at(i)))list2.removeAt(i); } QMessageBox::information(0,"Information","Ende",QMessageBox::Ok,0,0); }
-
Wo bricht das denn nun ab?
Und wie loescht du den Timer? Machst du das ueberhaupt?
-
Ach so, sorry, vergessen. Alle MsgBoxen bis auf die mit "Ende" werden angezeigt!
Und löschen tu ich den Timer nicht. Muss ich das? Und wo muss ich das?
-
Das Timer-Objekt musst du deswegen loeschen, weil du sonst einen Memory Leak hast (Speicher wird durch new angefordert, aber nicht mehr freigegeben).
Ich hab jetzt auch den Fehler gefunden.
falsch: for (int i=0;i<=list2.size();i++)
statt <= gehoert ein <..
richtig: for (int i=0;i<list2.size();i++)Bei solchen Sachen hilft es oft die Schleife Schritt fuer Schritt durchzugehen..
-
Danke, jetzt klappts! Aber muss ich den Timer auch manuell löschen, wenn der Timer bis zum Programmende laufen soll? Wird er da nicht automatisch gelöscht?
-
Dann macht es nix aus, aber ordentlicher (besserer Stil) ist es, wenn du ihn im Destruktor etc loescht.