我在Qt中的代码是这样的:
void doSomeStuff()
{
...
if(blah blah)
someObj.start();
...
}
然后someObj.run()
:
void someObj::run()
{
blah blah blah, do some stuff
doSomeStuff()
}
我打算是针对在someObj.start()
创建的新线程结束,然后主线程中的函数doSomeStuff
一旦停止就会再次被调用。但是我的程序随机崩溃,当我再次密切关注代码时,我意识到真正的情况可能是新线程只是调用函数而不会消失,从而不断产生新的线程。我的怀疑是否正确?如果是这样,我应该如何解决这个问题呢?
答案 0 :(得分:3)
通过浏览QT文档(我不是Qt专家),我找到了
http://doc.qt.io/qt-5/qthread.html
bool isFinished()const
你可以说从那里回电
答案 1 :(得分: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()
}