Seite 1 von 1

Timer-Ereignis

Verfasst: 19. Oktober 2010 23:08
von qtimho
Hallo,

ich habe eine Frage zum Timer-Ereignis in Qt3. Ich will alle 2 Sekunden abwechselnd ein Bild anzeigen lassen. Das erste Bild wird mit der Funktion

Code: Alles auswählen

zeigeBild1()
geladen, das zweite mit

Code: Alles auswählen

zeigeBild2()


Ich hätte gedacht, dass das folgendermaßen funktioniert:

Code: Alles auswählen

[...]
zeigeBild1();
ersterTimer = startTimer(2000);
zweiterTimer = startTimer(2000);
}

void Diashow::timerEvent(QTimerEvent *e)
{
    if (e->timerId() == ersterTimer)
	zeigeBild2();
    else { if (e->timerId() == zweiterTimer)
        zeigeBild1();
	}
}
[...]
Aber der Code hat zur Folge, dass immer nur das Bild zu sehen ist, dass mit der Funktion

Code: Alles auswählen

zeigeBild1()
geladen wird. Alle 2 Sekunden zuckt das Bild zwar, so dass ich denke, dass das 2. Bild auch irgendwie geladen wird, es ist aber nicht zu sehen. Es dominiert das erste Bild. Was ist hier mein Denkfehler?

Vielen Dank.
qtimho

Verfasst: 19. Oktober 2010 23:49
von qtimho
OK, ich habe es jetzt noch folgendermaßen versucht:

Code: Alles auswählen

[...]
zeigeBild1();
}

void Diashow::timerEvent(QTimerEvent *e)
{
    if (e->timerId() == ersterTimer)
	zeigeBild2();
     else { 
        if (ersterTimer == -1)
        zeigeBild1();
        }
}

void Diashow::zeigeBild1()
{
[...]

    ersterTimer = startTimer(2000);

}

void Diashow::zeigeBild2()
{
[...]
    
    killTimer(ersterTimer);
    ersterTimer=-1;
    zweiterTimer = startTimer(2000); 

[...]
Das klappt auch soweit ganz gut, bis auf wenige Aussetzer: Gelegentlich wird Bild 2 nicht geladen, stattdessen ist nur wieder ein kurzer Flackern zu sehen, aber Bild 1 dominiert, bzw. wenn ich die Zeiten des Timers erhöhe ist Bild 2 nur ganz kurz zu sehen, Bild 1 aber so wie es sein soll. Beende ich den 1. Timer nicht richtig? Ist das vllt. der Grund?

Viele Grüße
qtimho

Verfasst: 20. Oktober 2010 00:51
von kater
Du hast 2 Timer die du fast gleichzeitig startest. Sie lösen dann auch fast gleichzeitig die Funktion aus und es wird immer das selbe Bild gezeigt, weil der 2. Timer schon feuer nachdem der erste grad dran war.

Verfasst: 20. Oktober 2010 07:18
von qtimho
Hi,

genau das hatte ich mir auch gedacht und deshalb die Konstruktion in Bsp. 2 entworfen. Dort wird doch der erste Timer gekillt, oder? Wie kommt trotzdem diese Unregelmäßigkeit da rein, dass das 2. Bild manchmal zur kurz und manchmal sogar so kurz angezeigt wird, dass nur ein kurzes Flackern zu sehen ist?

Verfasst: 20. Oktober 2010 07:41
von Christian81
Das was Du willst geht ganz einfach mit QTimer::singleShot()

Verfasst: 20. Oktober 2010 19:40
von qtimho
Hallo,

vielen Dank für den Hinweis. Ich habe jetzt meinen Timer folgendermaßen umgeschrieben:

Code: Alles auswählen

[...]
timer = new QTimer(this);
timer->singleShot(true, this, SLOT (zeigeBild1()));
timer->start(10000);
timer->stop();
}

void Diashow::zeigeBild1()
{
[...]

    timer->singleShot(true, this, SLOT (zeigeBild2()));
    timer->start(10000);
    timer->stop();

}

void Diashow::zeigeBild2()
{
[...]
   
    timer->singleShot(true, this, SLOT (zeigeBild1()));
    timer->start(10000);
    timer->stop();

[...] 
Die beiden Bilder erscheinen auch abwechselnd aber sehr schnell hintereinander und nicht im bspw. 10-Sekunden-Takt. Egal, welchen Wert ich eingeben, sind es immer nur ganz kurze Intervalle. Was mache ich noch falsch?

Verfasst: 20. Oktober 2010 19:47
von franzf
Sry, entweder kannst du kaum Englisch oder du liest sehr oberflächlich, oder es fehlt elementares C++-Grundwissen.
*) QTimer::singleShot ist eine STATISCHE Funktion. Dafür braucht man kein Objekt.
*) Was ist ein "true" in einen int gecastet?
*) Timer starten und dann gleich wieder stoppen?!?
Hier einfach mal, wie es besser ausschaut:

Code: Alles auswählen

[...]QTimer::singleShot(10000, this, SLOT (zeigeBild1())); 
} 

void Diashow::zeigeBild1() 
{ 
[...] 

    QTimer::ingleShot(10000, this, SLOT (zeigeBild2()));

} 

void Diashow::zeigeBild2() 
{ 
[...] 
    
    QTimer::singleShot(10000, this, SLOT (zeigeBild1()));

Verfasst: 20. Oktober 2010 19:47
von upsala
Du startest einen Timer und stoppst ihn gleich wieder. Was soll das für einen Sinn machen?

Verfasst: 20. Oktober 2010 20:25
von qtimho
franzf hat geschrieben: *) QTimer::singleShot ist eine STATISCHE Funktion. Dafür braucht man kein Objekt.
*) Was ist ein "true" in einen int gecastet?
Vielen Dank für deine Antwort. Das mit der statischen Funktion war mir zwar klar, aber ich wollte irgendwie ein Timer-Objekt basteln, ein bisschen so wie hier http://www.proggen.org/doku.php?id=fram ... sses:timer habe dabei aber wohl was durcheinander geworfen, oder es war einfach der falsche Ansatz bzw. blöd gedacht. Wg. dem Bool hatte ich die QTimer Class Reference tatsächlich zu oberflächlich gelesen... :-(

nur ein Timer

Verfasst: 21. Oktober 2010 10:53
von softwaremaker
nimm doch nur ein Timer und eine Hilfsvariable

bool bild2geladen = false;

und in der Timer-Event-Funktion:

if (bild2geladen)
{
LadeBild1();
bild2geladen = false;
}
else
{
LadeBild2();
bild2geladen = true;
}

Aber lade das Bild nicht immer neu aus einer Datei/Resource, sondern blende es nur ein/aus (show/hide).