Я пытаюсь создать оболочку потока , которая будет выполнять лямбда-функцию с N параметрами INSIDE a __try
/ __except
как здесь определено: https://docs.microsoft.com/en-us/cpp/cpp/structured-exception-handling-c-cpp?view=vs-2019
Приложение не должно восстанавливаться после исключения. Он завершится сразу после вызова функции Windows для генерации Cra sh Dump , как здесь: https://docs.microsoft.com/en-us/windows/win32/dxtecharts/crash-dump-analysis
Поскольку это оболочка потока , я должен сделать ее как можно более обобщенной c, учитывая любые типы лямбда-сигнатур (при условии, что все они возвращают void
).
class MiniThread {
public:
template<typename F, typename... Args>
void run(F func, Args... args)
{
if (m_thread != nullptr)
join();
m_thread = new std::thread([&]() {
_run(func, std::forward<Args>(args)...);
});
m_started = true;
}
bool started() const { return m_started; }
void join();
~MiniThread();
private:
template<typename F, typename... Args>
void _run(F func, Args... args)
{
__try
{
func(std::forward<Args>(args)...);
}
__except (CrashDump::GenerateDump(GetExceptionInformation()))
{
// TODO: log.
}
}
std::thread *m_thread = nullptr;
bool m_started = false;
};
Мое тестовое использование таково:
// any parameters/arguments should work.
auto lambda = [this](std::string whatever, std::promise<uint> && p) {
// anything should work here.
};
std::promise<uint> promise;
std::string whatever = "whatever";
MiniThread thread;
thread.run(lambda, promise);
К сожалению, попытка построить это на Visual Studio 2017 вызывает следующую ошибку:
Error C2712 Cannot use __try in functions that require object unwinding
Я пытался "спрятать" код глубже в стек вызовов функций, но я предполагаю, что std::forward
упакованных variadic
args
не позволяет мне.
Пожалуйста, поймите, что мне ДЕЙСТВИТЕЛЬНО не нужно приложение для восстановления после cra * sh. Просто для того, чтобы сгенерировать дамп cra sh и завершить его.