Seite 1 von 1
Auf Beendigung eines Threads warten
Verfasst: 8. Mai 2008 09:17
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
Re: Auf Beendigung eines Threads warten
Verfasst: 8. Mai 2008 09:38
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
Re: Auf Beendigung eines Threads warten
Verfasst: 8. Mai 2008 10:33
von kitov
m_stop als volatile deklarieren
und wenn du thread stoppen willst
Re: Auf Beendigung eines Threads warten
Verfasst: 8. Mai 2008 10:35
von kitov
und ein sleep() oder usleep() in der schleife wäre nicht schlecht
Verfasst: 8. Mai 2008 12:23
von upsala
sleep? wait? Für was besitzt Qt eine Event-Routine, wenn sie keiner benutzen will?
Verfasst: 8. Mai 2008 12:51
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
Verfasst: 8. Mai 2008 12:52
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?
Verfasst: 8. Mai 2008 13:09
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