正在终止线程

Terminating thread

本文关键字:线程 终止      更新时间:2023-10-16

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

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

我看到您正在使用两种不同的策略进行连接。但是,如果thread_this(计数对话框)真的在两个分开的线程内,那么连接将始终是Qt::QueuedConnection。这不是问题所在。

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

调用exec()将暂停dummy_()的执行,直到对话框必须返回为止。当对话框返回时,线程将终止。所以我看不出的目的

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

顺便问一下,那是什么功能?我唯一知道的是CCD_ 5。我很有信心问题就在这里。。。

编辑:
progress.wait()不是问题所在。。。但线程发送的事件可能在某种程度上造成了麻烦。使用调试器或一些qDebug()查看在按下cancel后是否调用了update_progress_bar