我有一个显示进度条+其他一些数据的对话框,我在这个对话框上也有一个取消按钮。显示此对话框时,可能会进行大量计算,这会在进度条上显示。这个计算是从这个对话框代码开始的,所以我有:
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();
}
答案 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
。