2012-03-25 29 views
0

私は進行状況バーといくつかの他のデータを表示するダイアログを持っており、このダイアログにはキャンセルボタンもあります。このダイアログが表示されている間、プログレスバーに表示される重大な計算が行われる可能性があります。スレッドを終了する

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

1.優先順位を設定しないでください。それはただのトラブルを求めているだけです。あんな事はしないで! 2.キャンセル操作はどのように扱いますか? –

+0

@DavidHeffernanキャンセル操作が最後の接続として表示されます – smallB

+1

別のスレッドからスレッドを終了させるのは安全ではなく、悪い方法です。 "cancel"フラグを設定して、スレッドのコードがフラグをチェックし、それ自身が終了するようにしてください。 –

答えて

0

私はあなたが2つの異なる戦略を使用して接続していることがわかります。しかし、thread_this(数えられるダイアログ)が本当に2つの分離したスレッド内にある場合、接続は常にQt::QueuedConnectionになります。それは問題ではありません。ダイアログが返すようになるまで

progress.exec();//this will enter it's event loop 

呼び出しのexec()dummy_()の実行を中断。ダイアログが返ってきたらスレッドは終了します。だから私は目的を見ていない

progress.wait();//this will wait until thread is finished 

それはどのような機能ですか?私が知っているのはQthread::wait()だけです。私は、問題はここにあるかなり確信しています...

編集:
progress.wait()は問題ではありません...しかし、スレッドによって送信されたイベントが、中にトラブルを引き起こしている可能性があります何らかの形で。キャンセルを押した後にupdate_progress_barが呼び出されたかどうかを確認するには、デバッガまたはqDebug()を使用します。

+0

progress.waitはthread :: waitのラッパーです。つまり、このダイアログで開始されたスレッドの待機は、 – smallB

+0

となります。progress.wait()のコードを追加してください。 – UmNyobe

+0

#UmNyobe updated code – smallB

関連する問題