私は進行状況バーといくつかの他のデータを表示するダイアログを持っており、このダイアログにはキャンセルボタンもあります。このダイアログが表示されている間、プログレスバーに表示される重大な計算が行われる可能性があります。スレッドを終了する
Counting_Progress_Dialog::Counting_Progress_Dialog(QWidget *parent) :
QDialog(parent)
{
setupUi(this);
thread_ = new Threaded;//THIS IS THE THREAD IN WHICH COMPUTATION IS BEING PERFORMED
connect(thread_,SIGNAL(counter_value(int)),this,SLOT(update_progress_bar(int)));
connect(this,SIGNAL(rejected()),thread_,SLOT(terminate()),Qt::QueuedConnection);//
HERE I'M CONNECTING REJECTED ON DIALOG TO TERMINATE ON THREAD
}
void Counting_Progress_Dialog::start()
{
thread_->start(QThread::LowestPriority);
}
を、私はプログラムの一部でこれを起動します:
void My_Class::dummy_()
{
auto old_priority = this->thread()->priority();
this->thread()->setPriority(QThread::HighestPriority);
Counting_Progress_Dialog progress;
progress.start();//this will start thread
progress.exec();//this will enter it's event loop
progress.wait();//this will wait until thread is finished
this->thread()->setPriority(QThread::NormalPriority);
}
しかし、このすべてにもかかわらず、私は私のダイアログでキャンセルを押したときに、この計算は私が持っているこのダイアログコードをwithingから開始されます、アプリケーション全体がフリーズします。私は間違って何をしていますか?正しく動作させるには? UPDATED
:
void Counting_Progress_Dialog::wait()
{
thread_->wait();
}
1.優先順位を設定しないでください。それはただのトラブルを求めているだけです。あんな事はしないで! 2.キャンセル操作はどのように扱いますか? –
@DavidHeffernanキャンセル操作が最後の接続として表示されます – smallB
別のスレッドからスレッドを終了させるのは安全ではなく、悪い方法です。 "cancel"フラグを設定して、スレッドのコードがフラグをチェックし、それ自身が終了するようにしてください。 –