Показать сообщение отдельно

  #2  
Старый 30.01.2023, 16:46
RedHolms
Постоянный
Регистрация: 04.06.2020
Сообщений: 620
С нами: 3127813

Репутация: 133


По умолчанию

Цитата:
Сообщение от Scar_  

Много лет и сил потрачено, а нормального результата я так и не получил. Вкратце, хочу сделать асинхронные запросы чтобы основной поток не блокировался. Код ниже работает, но ломает выгрузку (скорее всего из-за не нормальную выгрузку std::future) но не требует для этого отдельного потока. Как починить выгрузку плагина или посоветуйте, поделитесь кодом как лучше сделать асинхронные запросы.

C++:





Код:
class
CRequest
{
private
:
struct
stRequestAdd
{
cpr
::
AsyncResponse m_Response
;
std
::
function

m_Callback
;
}
;
std
::
map

m_RequestPool
;
public
:
void
Handler
(
void
)
{
for
(
auto
&&
req
:
m_RequestPool
)
{
if
(
req
.
second
.
m_Response
.
valid
(
)
&&
req
.
second
.
m_Response
.
wait_for
(
std
::
chrono
::
seconds
(
0
)
)
==
std
::
future_status
::
ready
)
{
auto
&
key
=
req
.
first
;
auto
&
response
=
req
.
second
.
m_Response
.
get
(
)
;
req
.
second
.
m_Callback
(
key
,
response
)
;
m_RequestPool
.
erase
(
key
)
;
}
}
}
void
Get
(
const
std
::
string key
,
const
std
::
string url
,
std
::
function

callback
)
{
stRequestAdd tmp
;
tmp
.
m_Response
=
cpr
::
GetAsync
(
cpr
::
Url
{
url
}
)
;
tmp
.
m_Callback
=
callback
;
m_RequestPool
.
emplace
(
std
::
make_pair
(
key
,
std
::
move
(
tmp
)
)
)
;
}
}
;

Как вариант вообще использовать неблокирующие сокеты, но это уже зависит от того, какую библиотеку ты используешь для запросов

Как вариант, вручную создавать потоки, и где-то их сохранять, и если вызван DllMain с кодом завершения, завершать все потоки, либо join'ить их
 
Ответить с цитированием