PDA

View Full Version : Qthreads



Sheetal
7th March 2007, 06:37
Hi...I am creating a thread using QThread..
When i exit my application i want to kill this thread but i am getting the following error :

QThread object destroyed while thread is still running.

i want to kill this thread in the destructor of my main window...i tried calling terminate() in the destructor but i am still getting the same error...

please let me know soon wht can be done..

sunil.thaha
7th March 2007, 07:22
use QThread::wait() to wait for threads to complete before exiting.

Sheetal
7th March 2007, 08:55
i am using the following where i want to kill the thread :

MyThread.wait();
MyThread.exit();

What i have observed is that i still need to put a sleep() or a while loop between wait() and exit().
If i dont use the same then i still get the same error.
Is this the right way??

fullmetalcoder
7th March 2007, 09:03
When playing with Qthread I often use the following code in the destructor :

while ( isRunning() ) quit();

wysota
23rd March 2007, 06:41
When playing with Qthread I often use the following code in the destructor :

while ( isRunning() ) quit();

Oh, this really sucks - your CPU will go 100% if you do this. Calling wait() (and maybe quit() before that if you're running an event loop in the worker thread) should be enough, just make sure worker threads have a chance to exit at all.

TheKedge
23rd March 2007, 11:12
It might not apply to your job, but...

if you need to break off your job (stopping the thread in the middle of it's work) you can use a 'bool keepRunning' member variable in the threaded function.

run(){
keepRunning = true;
do{
//whatever - some short job
}while(someCondition&&keepRunning);

Then sub-class quit to look like

void AutomationThread::quit()
{
keepRunning = false;
QThread::quit();
}
Then you can stop the thread with
myThread->quit();
myThread->wait();//this will wait a maximum of one loop iteration.

Not always applicable, but I use that method all the time - my threads can run for hours (monitoring things, waiting)

by the way, a long sleep in my thread then looks like
for(int i=0; i<someLargeWait&&keepRunning; ++i){
msleep(100);
}
which can also be broken off quickly.

K