Когда завершается поток?
У меня есть код в Qt, который выглядит так:
void doSomeStuff()
{
...
if(blah blah)
someObj.start();
...
}
а потом someObj.run()
:
void someObj::run()
{
blah blah blah, do some stuff
doSomeStuff()
}
То, что я намеревался, для новой темы, созданной в someObj.start()
закончить, а затем функцию doSomeStuff
в главном потоке вызывается снова после остановки. Но моя программа зависала случайно, и когда я снова внимательно следил за кодом, я понял, что, возможно, реальный случай состоял в том, что новый поток просто вызывает функцию, не угасая, таким образом, непрерывно порождая новые потоки. Мои подозрения верны? Если так, как я должен исправить это?
2 ответа
doSomeStuff() в настоящее время вызывается, когда поток открыт, поэтому поток все еще будет жив, иначе он вообще не будет вызываться ^^, только когда doSomeStuff завершится, тогда ваш поток завершит работу.
Взглянув на документ QT (я не эксперт по Qt), я нашел
http://doc.qt.io/qt-5/qthread.html
bool isFinished () const
Вы могли бы сказать обратный звонок оттуда
Это кажется немного запутанным. Вы говорите, что ваш основной поток звонков 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()
}