2010-12-15 48 views
1

我有一些代码在Qt的是这样的:线程什么时候退出?

void doSomeStuff() 
{ 
    ... 
    if(blah blah) 
     someObj.start(); 
    ... 
} 

然后someObj.run()

void someObj::run() 
{ 
    blah blah blah, do some stuff 
    doSomeStuff() 
} 

我是什么打算是在someObj.start()创建结束新的线程,然后功能主线程中的doSomeStuff在停止后会再次被调用。但是我的程序随机崩溃,当我再次密切关注代码时,我意识到也许真正的情况是新线程只是在不停止的情况下调用函数,从而不断产生新线程。我的怀疑是否正确?如果是这样,我该如何补救?

+0

为什么会调用线程使函数该函数可以在调用它的线程以外的任何地方运行?另外,-1不要先尝试它。 – Falmarri 2010-12-15 04:48:39

+0

@Falmarri,所以我想在这里检查我的直觉是否正确。顺便说一句,我应该先尝试什么? – wrongusername 2010-12-15 04:49:48

+0

@Falmarri也许你认为我已经写了一些代码,并没有尝试过,并在这里发布......我应该更新问题,使其更清晰 – wrongusername 2010-12-15 04:51:51

回答

3

doSomeStuff()当线程exectured自我线程将还活着,否则它不会在所有被称为目前所谓的^^只有当doSomeStuff完成那么你的线程将退出

通过在掠QT DOC(我不是Qt的专家),我发现

http://doc.qt.io/qt-5/qthread.html

布尔isFinished()const的

你可以说从那里回拨

+0

如何实现回调? – wrongusername 2010-12-15 05:07:26

+0

没关系,我做了一个信号槽的东西:) – wrongusername 2010-12-15 06:24:21

1

这似乎有点混乱。你说你的主线程调用doSomeStuff()来不时地启动一个线程,但你也可以在线程运行函数中调用它。我只是假设有两种情况。我认为最有可能的情况是,你想线程每个doSomeStuff被称为主线程时间正好运行一次,如果是这样的:

void doSomeStuff() 
{ 
    ... 
    if(blah blah) 
    { 
     if(someObj.isRunning()) 
      someObj.wait(); 
     someObj.start(); 
    } 
    ... 
} 

void someObj::run() 
{ 
    blah blah blah, do some stuff 
} 

如果你真的这样做要线状体循环结束,结束,只需使用while循环,而不是试图再次调用它。你可能,在这种情况下,打算让线程肯定会每次doSomeStuff被调用运行肯定,所以你需要更聪明一点:

bool someObjRun = false; 
QMutex someObjRunLock; 

void doSomeStuff() 
{ 
    ... 
    if(blah blah) 
    { 
     someObjRunLock.lock(); 
     someObjRun = true; 

     if (!someObj.isRunning()) 
      someObj.start(); 

     someObjRunLock.unlock(); 
    } 
    ... 
} 

void someObj::run() 
{ 
    someObjRunLock.lock() 
    while(someObjRun) 
    { 
     someObjRunLock.unlock(); 

     blah blah blah, do some stuff 

     someObjRunLock.lock() 
     if(should quit...) 
     { 
      someObjRun = false; 
     } 

    } 
    someObjRunLock.unlock() 
} 
+0

我认为这是第一个案件。我想让主循环调用线程,让线程执行它的语句然后死掉,然后让'doSomeStuff'函数再次运行。那么'someObj.wait'会等到另一个线程停止运行? – wrongusername 2010-12-15 05:06:34

+0

是的,'QThread.wait()'阻塞调用线程,直到目标线程退出。 (http://doc.trolltech.com/4.7/qthread.html#wait) – SingleNegationElimination 2010-12-15 14:07:44

相关问题