Oberfläche "hängt" während Sleep-Befehl

Alles rund um die Programmierung mit Qt
Antworten
atlastraeger
Beiträge: 32
Registriert: 11. August 2004 12:42

Oberfläche "hängt" während Sleep-Befehl

Beitrag von atlastraeger »

Hallo Forum!
Ich bin mehr oder weniger Neuling in der Qt-Programmierung, daher folgende Anfängerfrage:
Ich habe einen Slot, der den Benutzer mit QMessageBox eine Frage stellt, und wenn der Benutzer diese Frage mit "Ja" beantwortet, muss der Slot einige Sekunden warten, bevor die nächsten Anweisungen ausgeführt werden. Dazu benutze ich den Sleep-Befehl. Das führt aber dazu, dass sich die QMessageBox zwar schließt, aber auf dem dahinter liegenden MainWindow eine hässliche leere Fläche erzeugt, bis der Sleep-Befehl vorbei ist.
Also meine Frage: gibt es einen "besseren" Sleep-Befehl, oder wie löse ich das Problem?

Vielen Dank im Voraus für alle Antworten!
miketech
Beiträge: 125
Registriert: 3. August 2004 11:19

Beitrag von miketech »

Hi,

das Problem hierbei ist, dass bei einem Sleep der gesamte Prozess angehalten wird, d.h. das komplette Programm bleibt stehen. Das ist auch der Grund, weshalb es zu Hängern in Deiner graphischen Oberfläche kommt, da auch das Repainten der Oberfläche angehalten wird.

Kannst Du dass ganze vielleicht mit einem Timer (Class QTimer) lösen? Du müsstest dann beim Klick auf "Ja" den Timer starten und eben festlegen, was passieren soll.

http://doc.trolltech.com/3.3/qtimer.html

Gruß

Mike
atlastraeger
Beiträge: 32
Registriert: 11. August 2004 12:42

Beitrag von atlastraeger »

Okay, danke, ich werde es mal auf diese Art probieren...
atlastraeger
Beiträge: 32
Registriert: 11. August 2004 12:42

Beitrag von atlastraeger »

Hmmm, eine Frage habe ich da aber noch:

es geht um folgenden slot:

void GUI3MainWindow::test(void){
QTimer *timer_go = new QTimer( &GUI3MainWindow);
QObject::connect( timer_go, SIGNAL(timeout()), &GUI3MainWindow, SLOT(test()));
....
}

Dann bekomme ich immer die Fehlermeldung "GUI3MainWindow: Ungültige Verwendung dieses Typs als Ausdruck". Was muss ich denn korrekterweise dort angeben?
miketech
Beiträge: 125
Registriert: 3. August 2004 11:19

Beitrag von miketech »

Hi,

in welcher Zeile ist der Fehler? Spontan fällt mir nur folgendes auf:

void GUI3MainWindow::test(void)

Sollte das nicht eher:

void GUI3MainWindow::test() heißen?

Ist es Absicht, dass das endlos laufen soll? Weil durch den Aufruf vom Slot, wird der Timer gestartet und dann wieder der Slot, dadurch wieder der Timer usw. :)

Gruß

Mike
atlastraeger
Beiträge: 32
Registriert: 11. August 2004 12:42

Beitrag von atlastraeger »

Hi, habe den Fehler gefunden. Und zwar muss ich den QTimer nicht erst im Slot selbst, sondern zuvor (bei der Deklaration der dazugehörigen Klasse), also so:

class GUI3MainWindow ... {
...
QTimer meinTimer;
....


und im Slot kann ich diesen dann mit

meinTimer.start(...);
...
aufrufen!!


Vielen Dank für die Hilfe !!!! :D :D


PS: ach so, dass der Timer immer wieder aufgerufen wird (dann wäre tatsächlich eine Endlossschleife vorhanden) verhindere ich mit einer static int Variable im slot...
miketech
Beiträge: 125
Registriert: 3. August 2004 11:19

Beitrag von miketech »

Ah ok, alles klar :)

Gruß

Mike
Antworten