LINUX.ORG.RU

История изменений

Исправление fsb4000, (текущая версия) :

Спроси у препода зачем это нужно, и как это делать.

У тебя тут join происходит, поэтому UI поток и блочится:

void Worker::run() {
    std::thread t(&Worker::worker, this);
    t.join();
}

Нормально делать нужно как-то так(код в IDE не запускал, писал прямо на лоре, если где опечатался, то исправишь сам):

// удаляем timer, мы и так знаем когда вызывать updateLabel()
// делаем наш класс Worker тоже QObject, чтобы появился слот
// deleteLater и мы могли emit сигнал doneProcess в конце метода 
// worker
void MainWindow::Work(){
    QThread* workerThread = nullptr;
    MyWorker* workerObject = nullptr;

    try {
        workerThread = new QThread;
        workerObject = new MyWorker(&currentShare);
    } catch (const std::exception& e) {
        if (workerThread != nullptr) {
            delete workerThread;
        }
        if (workerObject!= nullptr) {
            delete workerObject;
        }
        throw e;
    }

    connect(workerThread, &QThread::started, workerObject, &MyWorker::worker);
    connect(workerObject, &MyWorker::doneProcess, workerThread, &QThread::quit);
    connect(workerObject, &MyWorker::doneProcess, workerObject, &MyWorker::deleteLater);
    connect(workerThread, &QThread::finished, workerThread, &QThread::deleteLater);
    connect(workerThread, &QThread::finished, this, &MainWindow::updateLabel);

    workerThread->start();
}

Исходная версия fsb4000, :

Спроси у препода зачем это нужно, и как это делать.

У тебя тут join происходит, поэтому UI поток и блочится:

void Worker::run() {
    std::thread t(&Worker::worker, this);
    t.join();
}

Нормально делать нужно как-то так(код в IDE не запускал, писал прямо на лоре, если где опечатался, то исправишь сам):

// удаляем timer, мы и так знаем когда вызывать updateLabel()
// делаем наш класс Worker тоже QObject, чтобы появился слот
// deleteLater и мы могли emit сигнал doneProcess в конце метода 
// worker
void MainWindow::Work(){
    QThread* workerThread = nullptr;
    MyWorker* workerObject = nullptr;

    try {
        workerThread = new QThread;
        workerObject = new MyWorker(&currentShare);
    } catch (const std::exception& e) {
        if (workerThread != nullptr) {
            delete workerThread;
        }
        if (workerObject!= nullptr) {
            delete workerObject;
        }
        throw e;
    }

    connect(workerThread, &QThread::started, workerObject, &MyWorker::worker);
    connect(workerObject, &MyWorker::doneProcess, workerThread, &QThread::quit);
    connect(workerObject, &MyWorker::doneProcess, workerObject, &MyWorker::deleteLater);
    connect(workerThread, &QThread::finished, workerObject, &MyWorker::deleteLater);
    connect(workerThread, &QThread::finished, this, &MainWindow::updateLabel);

    workerThread->start();
}