История изменений
Исправление 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(¤tShare);
} 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(¤tShare);
} 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();
}