Я создал подкласс 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;
}
}