2015-03-26 5 views
1

Я пытаюсь добавить несколько потоков для моего приложения 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(); 
    } 
}; 

, но по-прежнему получать ту же ошибку

+0

Это единственный раз, когда к потоку обращается – Root0x

+1

Ваша переменная 'Thread' будет уничтожена, пока все еще работает (как в вашем предупреждении). вызовите 'QThread :: quit()' и дождитесь завершения с помощью 'QThread :: wait()' – Zaiborg

+0

С вашим редактированием теперь мы можем видеть, что не так, см. комментарий @Zaiborg :) –

ответ

0

Наследование QThread это один вопрос здесь, и я что объект Worker не имеет сходства потоков, которое, по вашему мнению, имеет и работает на основном потоке.

Причиной аварии является то, что вы создаете экземпляр темы на стеке,

if(tries == 10) 
{ 
    Thread t; // NOTE THIS IS ON THE STACK 
    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(""); 
} 

Экземпляр Thread разрушается, когда он выходит из области видимости.

Независимо от того, я настоятельно рекомендую следовать совету @Thomas и придерживаться способа, которым Maya использует потоки, без необходимости наследования QThread.

 Смежные вопросы

  • Нет связанных вопросов^_^