Qt QThread -- timeUpdate

Qt QThread -- timeUpdate
N0
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:55
0

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

Kopiuj
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:

Kopiuj
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

KR
  • Rejestracja:około 14 lat
  • Ostatnio:prawie 3 lata
  • Postów:353
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

N0
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:55
0

No ale jest przecież wątek

Kopiuj
#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();
            }
        }
    }
}
 
Kopiuj
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())); 
N0
  • Rejestracja:około 12 lat
  • Ostatnio:ponad 11 lat
  • Postów:55
0

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

HO
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 11 lat
  • Postów:283
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.


Jeśli uważasz mój post za wartościowy - daj punkt.
Mój post pomógł Ci rozwiązać problem - zaznacz go. Pozdrawiam

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.