终止线程

时间:2012-03-25 13:03:25

标签: c++ multithreading qt

我有一个显示进度条+其他一些数据的对话框,我在这个对话框上也有一个取消按钮。显示此对话框时,可能会进行大量计算,这会在进度条上显示。这个计算是从这个对话框代码开始的,所以我有:

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);
}  

但尽管如此,当我在对话框上按取消时,整个应用程序冻结了。我究竟做错了什么?如何使其表现正确?

更新:

void Counting_Progress_Dialog::wait()
{
    thread_->wait();
}

1 个答案:

答案 0 :(得分:0)

我看到你正在使用两种不同的策略进行连接。但是,如果thread_this(计数对话框)实际上位于两个独立的线程中,那么连接将始终为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()不是问题...但是线程发送的事件可能会以某种方式引起麻烦。使用调试器或某些qDebug()来查看推送取消后是否调用update_progress_bar