Среда: Visual Studio 2017, Windows 10 вер. 1709. Режим компиляции: релиз.
Когда я звоню:
accelerator_view acc_view = accelerator().default_view;
возникает исключение (см. ссылку на рисунок ниже), но после этого код работает нормально. Но когда исполняемый процесс завершается, и я вызываю:
::GetExitCodeProcess(hChildProcess, &retVal);
из вызывающего процесса вместо возврата 0 он возвращает значение мусора в retVal. Копаясь в исходном коде, проблема, похоже, заключается в фрагменте кода ниже (SchedulerBase.cpp, строка 149).
// Auto-reset event that is not signalled initially
m_hThrottlingEvent = platform::__CreateAutoResetEvent();
// Use a trampoline for UMS
if (!RegisterWaitForSingleObject(&m_hThrottlingWait, m_hThrottlingEvent, SchedulerBase::ThrottlerTrampoline, this, INFINITE, WT_EXECUTEDEFAULT))
{
throw scheduler_resource_allocation_error(HRESULT_FROM_WIN32(GetLastError()));
}
Я думаю, исправить это не в моих силах, потому что код выше находится внутри MFC. Тот же код хорошо работает при компиляции с помощью Visual Studio 2013. Обратитесь к рисунку, прикрепленному к стеку, показывающему возбужденное исключение (и перехваченное внутри), когда я вызываю
accelerator_view acc_view = accelerator().default_view;
Вопрос: как очистить AMP перед выходом и получить правильный результат при вызове GetExitCodeProcess()?
Вот рисунок: