Я запускаю программу openCL / openGL, которая использует wxWidget в качестве среды графического интерфейса
Внутри объекта класса, производного от wxThread, я выполняю некоторые сложные вычисления и собираю много программ openCL.Я хочу удалить поток. Но поток не удаляется сразу - он продолжает собирать программы и сразу после того, как завершает со всеми компиляциями.
Я знаю, что могу использовать wxThread::KIll()
для выхода из потока, ноэто вызывает некоторые проблемы с памятью, поэтому на самом деле это не вариант.
У меня есть класс myFrame, производный от wxFrame.it, имеет указатель pCanvas, который указывает на объект, производный от wxCanvas *. Объект pCanvas включает в себя myThread (который выполняет сложный расчет)
void myFrame::onExit(wxCommandEvent& WXUNUSED(event))
{
if(_pCanvas != NULL )
{
wxCriticalSectionLocker enter(_smokeThreadCS);
// smoke thread still exists
if (_pCanvas->getThread() != NULL)
{
//_pCanvas->getSmokeThread()->Delete(); <-waits until thread ends and after it application terminates
_pCanvas->getSmokeThread()->Kill(); <- immediately makes the application not responding
}
}
// exit from the critical section to give the thread
// the possibility to enter its destructor
// (which is guarded with m_pThreadCS critical section!)
while (true)
{
{ // was the ~MyThread() function executed?
wxCriticalSectionLocker enter(_smokeThreadCS);
if (!_pCanvas->getSmokeThread()) break;
}
// wait for thread completion
wxThread::This()->Sleep(1);
}
DestroyChildren();
Destroy();
// Close the main frame, this ends the application run:
Close(true);
}