Una delle cose che fa la mia app è ascoltare e ricevere i carichi utili da un socket. Non voglio mai bloccare. Su ogni payload ricevuto, voglio creare un oggetto e passarlo a un thread di lavoro e dimenticarlo fino a più tardi, ovvero come funziona il codice prototipo. Ma per il codice di produzione voglio ridurre la complessità (la mia app è grande) usando il comodo metodo asincrono. async prende un futuro fatto da una promessa. Per farlo funzionare ho bisogno di creare una promessa sul mio oggetto non POD rappresentato di seguito dalla classe Xxx. Non vedo alcun modo per farlo (vedi errore nel mio codice di esempio qui sotto). È appropriato usare async qui? Se sì, come posso costruire un/oggetto futura promessa che è più complessa di int (tutti gli esempi di codice ho vedono sia per uso int o void):può uno std :: promettere da un oggetto non POD?
#include <future>
class Xxx //non-POD object
{
int i;
public:
Xxx(int i) : i(i) {}
int GetSquare() { return i * i; }
};
int factorial(std::future<Xxx> f)
{
int res = 1;
auto xxx = f.get();
for(int i = xxx.GetSquare(); i > 1; i--)
{
res *= i;
}
return res;
}
int _tmain(int argc, _TCHAR* argv[])
{
Xxx xxx(2); // 2 represents one payload from the socket
std::promise<Xxx> p; // error: no appropriate default constructor available
std::future<Xxx> f = p.get_future();
std::future<int> fu = std::async(factorial, std::move(f));
p.set_value(xxx);
fu.wait();
return 0;
}
Hai provato a dare a 'Xxx' un ctor predefinito? – Angew
Perché non passi semplicemente 'xxx' alla funzione asincrona? Hai davvero bisogno della comunicazione bidirezionale "futura"? Ciò significa che entrambi i thread si stanno aspettando l'un l'altro. –
Capisco. Poiché ho già i dati del payload, non c'è bisogno di fare una promessa/futuro. Basta usare il costruttore _Fty && _Fnarg, _ArgTypes && ... _Args di asnyc con i miei argomenti complessi. – rtischer8277