Qt QThread -- timeUpdate

0

Potrzebuje wyświetlać zegar w programie. Do tego celu dodałem do mojej głównej pętli programu, instrukcje emit time_update();

void MainLoop::start()
{
    while(1){

        emit time_update();

        if(MainWindow::oczekujace.empty() && MainWindow::ladujace.empty()) continue;
        else{
            if(!MainWindow::oczekujace.empty()){
                QThread::msleep(4000);
                emit move();
            }
            if(!MainWindow::ladujace.empty()){
                QThread::msleep(4000);
                emit move2();
            }
        }
    }
} 

Sygnał ten jest przechwytywany w klasie MainWindow i tam w odpowiednim slotcie aktualizuje labela:

void MainWindow::TimeUpdate()
{
    time = QTime::currentTime();
    timeString = time.toString();
    ui->timeLabel->setText("Time: " +  timeString);
} 

Dlaczego to nie działa? Aplikacja się zawiesza. Pierwsza myśl, to to że potrzebuje osobny wątek na to, ale dlaczego nie mogę tego zrealizować w tym który już mam?

Pozdrawiam

0

Nie widze tutaj uzycia zadnych watkow. Kilka tematow wczesniej byl identyczny problem do Twojego. Czy nikt juz nie uzywa opcji szukaj?

https://github.com/Krycho/Qubic/tree/master/research/QThreadExample

0

No ale jest przecież wątek

#include "mainloop.h"
#include "includes.h"
#include "mainwindow.h"
#include <QTimer>

MainLoop::MainLoop() : QObject()
{
}

void MainLoop::start()
{
    while(1){

        //emit time_update();

        if(MainWindow::oczekujace.empty() && MainWindow::ladujace.empty()) continue;
        else{
            if(!MainWindow::oczekujace.empty()){
                QThread::msleep(4000);
                emit move();
            }
            if(!MainWindow::ladujace.empty()){
                QThread::msleep(4000);
                emit move2();
            }
        }
    }
}
 
QThread* thread = new QThread;

    loop.moveToThread(thread);

    connect(thread,SIGNAL(started()),&loop,SLOT(start()));

    connect(thread, SIGNAL(finished()),&loop,SLOT(deleteLater()));

    connect(&loop, SIGNAL(move()), this, SLOT(MoveItemToAir()));

    connect(&loop, SIGNAL(move2()), this, SLOT(MoveItemDown()));

    connect(&loop, SIGNAL(time_update()), this, SLOT(TimeUpdate())); 
0

Chyba wątek tu nie jest potrzebny, powinien wystarczyć QTimer ; -)

1

Wystarczy timer. Zalecam więcej Googla - to jak i ostatnie pytanie, gdzie Ci podrzuciłem linka, ma dobre wyniki w wyszukiwarce - znaczy się można znaleźć już odpowiedzi.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.