Ich habe einen Dialog, der Fortschrittsbalken + einige andere Daten anzeigt, und ich habe auch einen Abbrechen-Button in diesem Dialog. Während dieser Dialog angezeigt wird, wird möglicherweise eine umfangreiche Berechnung ausgeführt, die in der Statusleiste angezeigt wird. Diese Berechnung wird gestartet von withing diesen Dialog-Code, so habe ich:Abschluss-Thread
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);
}
und ich dies des Programms teil tun aufrufen:
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);
}
Aber trotz alledem, wenn ich auf meinem Dialog drücken Abbrechen , die gesamte Anwendung friert ein. Was mache ich falsch? Wie man es richtig verhält?
AKTUALISIERT:
void Counting_Progress_Dialog::wait()
{
thread_->wait();
}
1. Sie sollten keine Prioritäten setzen. Das verlangt nur Ärger. Hör auf! 2. Wie gehen Sie mit dem Abbruchvorgang um? –
@DavidHeffernan meine Cancel-Operation wird als letzte Verbindung angezeigt – smallB
Beenden eines Threads aus einem anderen Thread ist unsicher und schlechte Praxis. Setzen Sie besser ein "Abbrechen" -Flag, lassen Sie den Code des Threads nach dem Flag suchen und beenden Sie es selbst. –