UE4 удалите FRunnableThread для отдыха - PullRequest
1 голос
/ 13 июля 2020

Я создал подкласс FRunnable, который имеет свойство FRunnableThread, pRunnableThread, и класс runnable был разработан так, что метод Run() останется в al oop до тех пор, пока не будет отключена логическая переменная. У меня возникла проблема с удалением экземпляра pRunnableThread.

Я думал, что смогу удалить и аннулировать pRunnableThread во время метода Exit(), но это приводит к тому, что метод Stop() немедленно вызывается, и ничего после delete pRunnableThread не выполняется. Итак, я аннулирую pRunnableThread в методе Stop (), и это работает; однако мне это не кажется интуитивно понятным, и я думаю, что это неправильно, потому что в комментарии для Stop () говорится, что он вызывается, если потоку предлагается завершить досрочное завершение, но я не думаю, что это должно быть так, потому что Метод Run () завершается, и вызывается Exit ().

Если я вызываю WaitForCompletion() перед вызовом delete, это предотвратит вызов метода Stop(), но все равно ничего не будет выполнено после delete pRunnableThread .

Как правильно удалить pRunnableThread?

void FLoopRunnable::Stop()
{
    bLoop = false;
    if (pRunnableThread != nullptr)
    {
        delete pRunnableThread;
    }
    pRunnableThread = nullptr; // Exit() deleted pThread, invalidate it here
}

void FLoopRunnable::Exit()
{
    if (pRunnableThread)
    {
        // If WaitForCompletion is called before delete, then Stop() is not called
        // pRunnableThread->WaitForCompletion();

        // Stop() immediately gets invoked after calling delete here and nothing after delete gets executed.
        delete pRunnableThread;

        // Does not get executed
        pRunnableThread = nullptr;
    }
}
...