Auf Beendigung eines Threads warten

Alles rund um die Programmierung mit Qt
Antworten
pospiech
Beiträge: 232
Registriert: 1. September 2006 17:20
Wohnort: Hannover

Auf Beendigung eines Threads warten

Beitrag von pospiech »

Ich mache derzeit folgendes

Code: Alles auswählen

	Algorithm.stop();
	if (Algorithm.isRunning())
		while(!Algorithm.isFinished()){}
die erste Zeile setzt eine Variabel m_stop auf true, welches dann im Thread mit der nächsten kommenden Iteration dazu führt das der Thread beendet wird.

Jetzt sorgt aber die while Schleife dafür das der Thread nicht mehr weiterläuft, da die while Schleife den Prozessor blockiert. Wie mache ich das dann so dass es zuverlässig funktioniert?

Matthias
Deever
Beiträge: 90
Registriert: 9. Mai 2007 18:20

Re: Auf Beendigung eines Threads warten

Beitrag von Deever »

pospiech hat geschrieben:Wie mache ich das dann so dass es zuverlässig funktioniert?
Äh, mit Signals und Slots arbeiten? Oder ist das zu zuverlässig?

SCNR && Gruß,
/dev
kitov
Beiträge: 36
Registriert: 29. November 2006 12:24

Re: Auf Beendigung eines Threads warten

Beitrag von kitov »

m_stop als volatile deklarieren
und wenn du thread stoppen willst

Code: Alles auswählen

m_stop=false;
wait()
kitov
Beiträge: 36
Registriert: 29. November 2006 12:24

Re: Auf Beendigung eines Threads warten

Beitrag von kitov »

und ein sleep() oder usleep() in der schleife wäre nicht schlecht
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

sleep? wait? Für was besitzt Qt eine Event-Routine, wenn sie keiner benutzen will?
Sephral
Beiträge: 201
Registriert: 1. Februar 2006 09:40
Kontaktdaten:

Beitrag von Sephral »

Hallo,
gib Deinem Thread ne wenig Zeit sich selbst zu beenden, wenn er nach der Zeit noch läuft, einfach mit terminate beenden.

Ciao,
Sephral
pospiech
Beiträge: 232
Registriert: 1. September 2006 17:20
Wohnort: Hannover

Beitrag von pospiech »

upsala hat geschrieben:sleep? wait? Für was besitzt Qt eine Event-Routine, wenn sie keiner benutzen will?
kannst du das genauer ausführen?
ObeliX
Beiträge: 59
Registriert: 14. November 2007 17:47

Beitrag von ObeliX »

warum sollte man mit signals/slots und ner event-loop arbeiten, wenn man lediglig nen thread beenden will ? wait() ist doch genau dafür gedacht, daß ohne event-routine zu machen.

hier mal wie sowas bei mir regelmäßig aussieht :

Code: Alles auswählen

MyThread::MyThread()
  : QThread()
{
  m_bLeaveThreadLoop=false;
  m_bThreadLoopBlocked=false;
}

MyThread::~MyThread()
{
  LeaveThreadLoop();
}

bool MyThread::StartThreadLoop(QThread::Priority eThreadPriority/*=QThread::InheritPriority*/)
{
  if(isRunning()) return false;            // thread already running

  start(eThreadPriority);                   // start thread loop

  return true;
}

void MyThread::LeaveThreadLoop()
{
  if(isRunning()) {                                              // if thread is active (run()-loop working) ...
    m_bLeaveThreadLoop=true;                          // ... request to leave run()-loop
    if(m_bThreadLoopBlocked) {                          // if thread contains blocking commands and loop is blocked yet ...
      //TuWasUmDieBlockierungAufzuheben;           // ... it should exist a way to unblock it, so that the loop can continue
    }                                                                // (w/o such a way, thread is permitted to execute the blocking command only,
                                                                      // if its termination in that position is assured w/o lose of any data
    wait(500);                                                    // wait 500 ms that thread finishes its operation
    if(isRunning()) {                                            // if thread is still working after that time ...
      terminate();                                               // ... it has to be terminated (finish it the hard way)
      wait();                                                       // and wait again until termination is done
    }
  }
}

void MyThread::run()
{
  m_bLeaveThreadLoop=false;

  while(!m_bLeaveThreadLoop) {

    //DoSomethingImportant

    m_bThreadLoopBlocked=true;                    // mark blocking commands this way
    //Wait4Something();                                   //
    m_bThreadLoopBlocked=false;                  //

    //DoSomethingImportant
  }
}
und auch gegen ein usleep ist IMHO nichts zu sage, wenn es korrekt eingebaut ist. ein generelles usleep ist natürlich quatsch, aber mit if(NIX_ZU_TUN) usleep(100000) else { normaler thread-code }; in der thread-schleife, gibt man die CPU-zeit des thread-prozesses wieder an das BS ab, wenn sowieso nichts zu tun ist und der thread sonst nur mit 100%-last leerlaufen würde. und die sleep-zeit muß man der situation angemessen wählen, damit der lag nicht zu groß ist um zu reagieren wenn wieder etwas thread-relevantes ansteht.


Obel
Antworten