Я пытаюсь добавить несколько потоков для моего приложения Qt, но верно, когда он выполняет эту нить программы просто выходит из строя, и я получаю ошибкуQThread: Разрушенный пока поток все еще работает и QMutex уничтожил
QThread: Разрушенный пока поток еще работает
QMutex: уничтожив запертый мьютекс
Я понимаю, сообщение об ошибке я просто не знаю, как я могу это исправить. Мой код ниже.
Заголовок
class Worker : public QObject
{
Q_OBJECT
private slots:
void onTimeout()
{
qDebug()<<"Worker::onTimeout get called from?: "<<QThread::currentThreadId();
}
};
class Thread : public QThread
{
Q_OBJECT
private:
void run()
{
qDebug()<<"From work thread: "<<currentThreadId();
QTimer timer;
Worker worker;
connect(&timer, SIGNAL(timeout()), &worker, SLOT(onTimeout()));
timer.start(1000);
exec();
}
};
login.cpp
void Login::on_pushButton_clicked()
{
QSqlQuery query;
QString Username = ui->Username_lineEdit->text();
QString Password = ui->Password_lineEdit->text();
query.prepare("SELECT * FROM Program_account WHERE Login = '"+ Username +"' AND Password = '"+ Password +"'");
if(!query.exec())
{
qDebug() << "SQL QUERY Login:" << query.executedQuery();
qDebug() << "SQL ERROR Login:" << query.lastError();
}
else if(!query.first())
{
tries++;
int x = 10 - tries;
ui->label->setText("Incorrect Username or Password " + QString::number(x) + " tries until timeout");
}
else
{
QSqlQuery Account_Type_Query("SELECT Account_Type FROM Program_account WHERE Login = '"+ Username +"' AND Password = '"+ Password +"'");
while(Account_Type_Query.next())
{
Account_Type = Account_Type_Query.value(0).toInt();
}
tries = 0;
static Home *home = new Home;
home->show();
close();
}
if(tries == 10)
{
Thread t;
t.start();
ui->label->setText("Password entered wrong too many times, entered 10 minute cooldown period");
ui->pushButton->hide();
QTimer::singleShot(600000, ui->pushButton, SLOT(show()));
tries = 0;
ui->label->setText("");
}
Что такое правильный способ я могу исправить эту проблему. Вся помощь очень ценится.
Спасибо
Update: Пробовал класс Тема: общественный QThread { Q_OBJECT
private:
void run()
{
while(QThread::wait())
{
qDebug()<<"From work thread: "<<currentThreadId();
QTimer timer;
Worker worker;
connect(&timer, SIGNAL(timeout()), &worker, SLOT(onTimeout()));
timer.start(1000);
exec();
}
QThread::quit();
}
};
, но по-прежнему получать ту же ошибку
Это единственный раз, когда к потоку обращается – Root0x
Ваша переменная 'Thread' будет уничтожена, пока все еще работает (как в вашем предупреждении). вызовите 'QThread :: quit()' и дождитесь завершения с помощью 'QThread :: wait()' – Zaiborg
С вашим редактированием теперь мы можем видеть, что не так, см. комментарий @Zaiborg :) –