Когда завершается поток? - PullRequest
1 голос
/ 15 декабря 2010

У меня есть код в Qt, который выглядит следующим образом:

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

, а затем someObj.run():

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

То, что я намеревался , предназначено дляновый поток создается в someObj.start() до конца, а затем функция doSomeStuff в главном потоке вызывается снова после остановки.Но моя программа зависала случайно, и когда я снова внимательно следил за кодом, я понял, что, возможно, реальный случай состоял в том, что новый поток просто вызывает функцию, не угасая, таким образом, непрерывно порождая новые потоки.Мои подозрения верны?Если да, то как мне это исправить?

Ответы [ 2 ]

3 голосов
/ 15 декабря 2010

doSomeStuff () в настоящее время вызывается, когда поток открыт, эго поток все еще будет жив, иначе он вообще не будет вызываться ^^, только когда doSomeStuff завершится, тогда ваш поток завершит работу

.документ QT (я не эксперт по Qt) я нашел

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

bool isFinished () const

вы могли бы сказать, что обратный вызовоттуда

1 голос
/ 15 декабря 2010

это кажется немного запутанным.Вы говорите, что ваш основной поток время от времени вызывает 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()
} 
...