2012-03-25 11 views
0

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

1. Sie sollten keine Prioritäten setzen. Das verlangt nur Ärger. Hör auf! 2. Wie gehen Sie mit dem Abbruchvorgang um? –

+0

@DavidHeffernan meine Cancel-Operation wird als letzte Verbindung angezeigt – smallB

+1

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. –

Antwort

0

Ich sehe, dass Sie 2 verschiedene Strategien verbinden. Aber wenn thread_ und this (Zähldialog) wirklich innerhalb von zwei getrennten Threads sind, dann wird die Verbindung immer Qt::QueuedConnection sein. Nun, das ist nicht das Problem.

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

Aufruf exec() unterbricht die Ausführung von dummy_(), bis der Dialog zurückkehren. Und wenn der Dialog zurückkehrt, wird der Thread beendet. So sehe ich nicht den Zweck von

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

Übrigens, welche Funktion ist das? der einzige, den ich kenne, ist Qthread::wait(). Ich bin ziemlich zuversichtlich, das Problem hier ist ...

edit:
progress.wait() ist nicht das Problem ... Aber es ist möglich, dass die Ereignisse durch den Thread gesendet Probleme verursachen in irgendwie. Verwenden Sie den Debugger oder einige qDebug(), um zu sehen, ob update_progress_bar aufgerufen wird, nachdem Sie Abbrechen drücken.

+0

progress.wait ist einfach Wrapper für thread :: wait, was bedeutet, dass warten auf Thread in diesem Dialogfeld gestartet wird – smallB

+0

den Code für progress.wait() fügen Sie bitte – UmNyobe

+0

#UmNyobe aktualisierten Code – smallB