несколько функций для запуска UDP сервера на асио с коллбэками на прием данных:
static asio::io_context io_context;
static HSA::Adapter* adapter = nullptr;
extern "C" HSA_EXPORT void Run() { io_context.run(); }
extern "C" HSA_EXPORT void Stop() { io_context.stop(); }
extern "C" HSA_EXPORT void CreateAdapter() { adapter = new HSA::Adapter(io_context); }
extern "C" HSA_EXPORT void FreeAdapter() { delete adapter; adapter = nullptr; }
extern "C" HSA_EXPORT void SetCallback(HSA_TelemetryCallback callback) { adapter->setTelemetryUnmangledCallback(callback); }
extern "C" HSA_EXPORT HSA_Telemetry Read() { return adapter->telemetryUnmangled(); }
Проблема заключается в том, что io_context.run блокирует основной поток программы, из которого эта функция вызывается (сама конечная программа на C#, если это важно). Как можно корректно обернуть все это в фоновый поток, чтобы функция Run() была неблокирующей?
Вызов run надо в поток
Не ясно что за вопрос. Что значит корректно, как обернуть... Так то всё просто, взять и обернуть, но может у тебя какие-то требования есть
Уже обернул в простой detach(), проблема решена.
Detached thread имеется в виду?
extern "C" HSA_EXPORT void Run() { std::thread t([]() { io_context.run(); }); t.detach(); }
А останавливать как это дело будешь? А результат как получать обратно?
Не лучше ли то же самое делать в приложении?
Останавливаю через вызов io_context.stop(). Результат через коллбэк.
А синхронизация?
Как включить syntax highlighting в ` коде?
дописать cpp после открывающих тройных кавычек
Если что, смотри в закрепе, там всё написано
Обсуждают сегодня