170 похожих чатов

Всем доброго дня. Есть shared библиотека на C++, которая имеет

несколько функций для запуска 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() была неблокирующей?

14 ответов

24 просмотра

Вызов run надо в поток

Не ясно что за вопрос. Что значит корректно, как обернуть... Так то всё просто, взять и обернуть, но может у тебя какие-то требования есть

d- Автор вопроса
Ilya Zviagin
Не ясно что за вопрос. Что значит корректно, как о...

Уже обернул в простой detach(), проблема решена.

d- Автор вопроса

extern "C" HSA_EXPORT void Run() { std::thread t([]() { io_context.run(); }); t.detach(); }

А останавливать как это дело будешь? А результат как получать обратно?

d
extern "C" HSA_EXPORT void Run() { std::thread t...

Не лучше ли то же самое делать в приложении?

d- Автор вопроса
Ilya Zviagin
А останавливать как это дело будешь? А результат ...

Останавливаю через вызов io_context.stop(). Результат через коллбэк.

d
extern "C" HSA_EXPORT void Run() { std::thread t...

Как включить syntax highlighting в ` коде?

d- Автор вопроса
Exypn0x
Как включить syntax highlighting в ` коде?

дописать cpp после открывающих тройных кавычек

Exypn0x
Как включить syntax highlighting в ` коде?

Если что, смотри в закрепе, там всё написано

Похожие вопросы

Обсуждают сегодня

Коллеги, я тут для личных нужд пошел ставить MQTT сервер, пощупал mosquitto, но ужаснулся отсутствию такой банальности, как HTTP API для посмотреть список топиков. А тут что,...
Maksim Lapshin
13
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
#include <stdio.h> #include <stdlib.h> #include <time.h> void mass_first_generate(int mass[5][7]) {     for (int N = 0; N < 5; N++) {         for (int A = 0; A < 7; A++) {   ...
Чувак
6
Всем привет! Решаю 99 OCaml Problems и столкнулся со следующей проблемой (прошу палками не забивать, я OCaml практически не трогал до этого момента): open OUnit2 let create_...
К|/|pи/\/\ 6е3yглbIи
2
https://www.linkedin.com/posts/ugama-benedicta-kelechi-codergirl-103041300_mobiledevelopment-fluttertraining-handsonlearning-activity-7263445699227254784-IdHB?utm_source=share...
CoderGirl
16
Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
возможно ли как-то передать в электрон или таури медиа поток с рендера 2д движка? двиг запускается как dll, а дальше надо как-то отправлять рендер кодировать не подходит, зр...
Kyle Nekto
7
Точно, оно. У тебя там имена потоков выставляются?
Александр (Rouse_) Багель
11
Помогите пожалуйста. Делаю систему плагинов. Проблема сейчас в такая: плагины загружаются в основном потоке. FLibHandle := SafeLoadLibrary(FFileName) Но нужно еще выполнить фу...
Илья 🤣
10
объясните пожалуйста, почему функция не работает должным образом? вроде должно брать активное окно сравнивать его размер с размером экрана, и если есть совпадение = true прове...
JF
12
Карта сайта