Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

timer



  • tengo 2 timers uno en la funcion uno y el otro en dos, lo que sucede es que cuando uno(), hace lo suyo, no se inicia dos(), no se el motivo y ya no se por donde encararlo.Gracias.

    void MainWindow::on_play_clicked()
    {

    ui->tabla2->hide();
    
    nivel = 1;
    
    ui->blindg->setText(ui->tabla2->item(i,0)->text()+"/"+ui->tabla2->item(i,1)->text());
    ui->anteg->setText(ui->tabla2->item(i,2)->text());
    ui->blinds2->setText(ui->tabla2->item(i+1,0)->text()+"/"+ui->tabla2->item(i+1,1)->text());
    ui->ante2->setText(ui->tabla2->item(i,2)->text());
    ui->blindtime->setText(ui->tabla2->item(i,3)->text());
    ui->level->setText(QString::number(nivel));
    
    uno();
    
    ui->blindg->setText(ui->tabla2->item(i,0)->text()+"/"+ui->tabla2->item(i,1)->text());
    ui->anteg->setText(ui->tabla2->item(i,2)->text());
    ui->blinds2->setText(ui->tabla2->item(i+1,0)->text()+"/"+ui->tabla2->item(i+1,1)->text());
    ui->ante2->setText(ui->tabla2->item(i,2)->text());
    ui->blindtime->setText(ui->tabla2->item(i,3)->text());
    ui->level->setText(QString::number(nivel));
    
    dos();
    
    
    ui->blindg->setText(ui->tabla2->item(i,0)->text()+"/"+ui->tabla2->item(i,1)->text());
    ui->anteg->setText(ui->tabla2->item(i,2)->text());
    ui->blinds2->setText(ui->tabla2->item(i+1,0)->text()+"/"+ui->tabla2->item(i+1,1)->text());
    ui->ante2->setText(ui->tabla2->item(i,2)->text());
    ui->blindtime->setText(ui->tabla2->item(i,3)->text());
    ui->level->setText(QString::number(nivel));

  • Moderators

    Estupendo.

    También creo que puedes eliminar las llamadas a startTimer y killTimer, pues no las estás usando (al menos en el código que mostraste).

    Por favor, si el tema se solucionó, no te olvides de marcarlo como "solucionado".

    Un saludo


  • Moderators

    Hola

    ¿Qué es uno() y dos()? Supongo que funciones. No nos has mostrado como inicias los timers. ¿Se inician dentro de esas funciones? ¿Conectaste las señales "timeout" de los timers?

    Un saludo



  • @Casino
    Si, uno y dos son dos funciones, en el mainwindow.h tengo:

    QTimer *cronometro;
    QTimer *crono;
    en el mainwindow.cpp:

    cronometro = new QTimer(this);
    QObject::connect(cronometro, SIGNAL(timeout()), this, SLOT(uno()));
    timerId = startTimer(60);

    crono = new QTimer(this);
    QObject::connect(crono, SIGNAL(timeout()), this, SLOT(dos()));
    timerId1 = startTimer(60);
    

    uno()
    {
    ui->seg->display(s);
    ui->min->display(m);
    ui->mtotal->display(mt);
    ui->p1->setText(QString::number(timerId));
    cronometro->start(1000);
    s++;
    if(s > 9){
    s = 0;
    m++;
    mt++;
    if(m == ui->tabla2->item(i,3)->text().toInt()){
    m = 0;
    cronometro->stop();
    killTimer(timerId);
    alarma->play();
    nivel++;
    i++;
    }
    dos()
    {
    ui->seg->display(s);
    ui->min->display(m);
    ui->mtotal->display(mt);
    ui->p2->setText(QString::number(timerId1));
    crono->start(1000);
    s++;
    if(s > 9){
    s = 0;
    m++;
    mt++;
    if(m == ui->tabla2->item(i+1,3)->text().toInt()){
    m = 0;
    crono->stop();
    killTimer(timerId1);
    alarma->play();
    nivel++;
    i++;
    }

    no paso de uno(), cuando esta funcion termina la otra NI, si le pongo un condicional menos.......


  • Moderators

    Hola

    A ver si entendí, quieres que cuando pulses el botón "play" se inicie el temporizador 1, cuando este termine se llame al método "uno()". En éste método se inicia el temporizador 2, y cuando éste termine, se llame al método "dos()". No sé si estoy en lo cierto.

    Si es así, lo que tienes que hacer es en el constructor de mainwindows configuras los dos temporizadores:

    cronometro = new QTimer(this);
    QObject::connect(cronometro, SIGNAL(timeout()), this, SLOT(uno()));
    
    crono = new QTimer(this);
    QObject::connect(crono, SIGNAL(timeout()), this, SLOT(dos()));
    // si necesitas que solo se ejecute una vez..
    crono->setSingleShot(true);
    

    luego, en el método on_play_clicked() inicias el temporizador, pero no tienes que llamar diréctamente a uno(), ya lo hará la señal que henos conectado arriba:

    cronometro->start(1000); // 1 segundo
    

    Y en la función uno() inicias el segundo temporizador, que cuando termine llamará a la función dos()

    crono->start(1000);
    

    Si no los haces singleShot se estarán ejecutando continuamente. También puedes ponerle singleShot(true) y luego dentro de dos vuelves a llamar a

    cronometro->start(1000);
    

    para que vuelva a iniciarse la secuencia y repetir el proceso.

    Tu tienes hechas las conexiones y además dentro de on_play_clicked() también llamas a uno() y dos(), por lo que supondo que esas funciones se están ejecutando más veces de la cuenta.

    No necesitas llamar a startTimer() ni tampoco parar los timers, simplemente hazlos singleShot.

    No sé si es el comportamiento que buscas, es lo que entendí.

    Un saludo



  • Para aclararte el panorama, ante todo gracias, lo que estoy queriendo hacer es lo siguiente:
    Viste los distintos softwares que hay para torneos de poker texas???, Bueno como quiero agregarles algo que no tienen me puse a hacer uno desde 0; como sabrás en el juego se inicia generalmente con ventanas de tiempo que duran de acuerdo al tipo de torneo, pero lo mas común seria 20,20,20,15,15,15,15,10,10,10 y así sucesivamente(por cierto son minutos), pero en todos esos tiempos necesitas que el timer vaya de 20 a 0, 20 a 0, 15 a 0, 10 a 0, etc. Eso me mato, creí que era la parte mas fácil y termine empantanado. Gracias por todo.



  • Hola, acabo de hacer lo que me dijiste, pero el inicio de crono dentro de uno(), no surte efecto, te envio como quedo:

    void MainWindow::uno()
    {
    ui->blindg->setText(ui->tabla2->item(i,0)->text()+"/"+ui->tabla2->item(i,1)->text());
    ui->anteg->setText(ui->tabla2->item(i,2)->text());
    ui->blinds2->setText(ui->tabla2->item(i+1,0)->text()+"/"+ui->tabla2->item(i+1,1)->text());
    ui->ante2->setText(ui->tabla2->item(i,2)->text());
    ui->blindtime->setText(ui->tabla2->item(i,3)->text());
    ui->level->setText(QString::number(nivel));

    ui->seg->display(s);
    ui->min->display(m);
    ui->mtotal->display(mt);
    ui->p1->setText(QString::number(timerId));
    s++;
    if(s > 9){
        s = 0;
        m++;
        mt++;
        if(m == ui->tabla2->item(i,3)->text().toInt()){
            m = 0;
            cronometro->stop();
            killTimer(timerId);
            alarma->play();
            nivel++;
            i++;
            ui->blindg->setText(ui->tabla2->item(i,0)->text()+"/"+ui->tabla2->item(i,1)->text());
            ui->anteg->setText(ui->tabla2->item(i,2)->text());
            ui->blinds2->setText(ui->tabla2->item(i+1,0)->text()+"/"+ui->tabla2->item(i+1,1)->text());
            ui->ante2->setText(ui->tabla2->item(i,2)->text());
            ui->blindtime->setText(ui->tabla2->item(i,3)->text());
            ui->level->setText(QString::number(nivel));
            crono->start();
        }
    }
    

    }

    void MainWindow::dos()
    {

    ui->seg->display(s1);
    ui->min->display(m1);
    ui->mtotal->display(mt);
    ui->p2->setText(QString::number(timerId1));
    s++;
    if(s1 > 9){
        s1 = 0;
        m1++;
        mt++;
        if(m1 == ui->tabla2->item(i+1,3)->text().toInt()){
            m1 = 0;
            crono->stop();
            killTimer(timerId1);
            alarma->play();
            nivel++;
            i++;
            ui->blindg->setText(ui->tabla2->item(i,0)->text()+"/"+ui->tabla2->item(i,1)->text());
            ui->anteg->setText(ui->tabla2->item(i,2)->text());
            ui->blinds2->setText(ui->tabla2->item(i+1,0)->text()+"/"+ui->tabla2->item(i+1,1)->text());
            ui->ante2->setText(ui->tabla2->item(i,2)->text());
            ui->blindtime->setText(ui->tabla2->item(i,3)->text());
            ui->level->setText(QString::number(nivel));
    
        }
    }
    

    }

    void MainWindow::on_play_clicked()
    {

    ui->tabla2->hide();
    
    nivel = 1;
    
    cronometro->start(1000);
    

    }


  • Moderators

    Hola

    Dentro de uno() llamas a start() sin pasarle la duración, no sé si será por eso.

            crono->start();
    

    De todas formas, dices que no funciona, pero no nos explicas cómo debe funcionar y como está funcionado en realidad para que sepamos qué está fallando.

    Un saludo



  • Orejas de burro para mi, me comí el crono->start(1000); Muchísimas Gracias.-


  • Moderators

    Estupendo.

    También creo que puedes eliminar las llamadas a startTimer y killTimer, pues no las estás usando (al menos en el código que mostraste).

    Por favor, si el tema se solucionó, no te olvides de marcarlo como "solucionado".

    Un saludo


Log in to reply