Jedną z rzeczy, którą robi moja aplikacja, jest słuchanie i odbieranie ładunków z gniazda. Nigdy nie chcę blokować. Na każdym odebranym ładunku, chcę utworzyć obiekt i przekazać go do wątku roboczego i zapomnieć o nim dopiero później, jak działa prototypowy kod. Ale dla kodu produkcyjnego chcę zmniejszyć złożoność (moja aplikacja jest duża) za pomocą wygodnej metody asynchronicznej. async bierze przyszłość z obietnicy. Aby to działało, muszę utworzyć obietnicę na moim obiekcie nie-POD reprezentowanym poniżej przez klasę Xxx. Nie widzę sposobu, aby to zrobić (zobacz błąd w moim przykładowy kod poniżej). Czy warto tutaj używać asynchronicznego? Jeśli tak, to w jaki sposób można skonstruować obietnica/przyszłego obiektu, który jest bardziej skomplikowane niż int (wszystkie przykłady kodu mam zobaczyć użyć int lub void):Czy std :: obietnica może być wykonana z obiektu innego niż 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;
}
Czy próbowałeś dać 'Xxx' domyślnemu ctorowi? – Angew
Dlaczego po prostu nie przekazujesz 'xxx' do funkcji asynchronicznej? Czy naprawdę potrzebujesz dwukierunkowej komunikacji "przyszłościowej"? Oznacza to po prostu, że oba wątki czekają na siebie nawzajem. –
Rozumiem. Ponieważ mam już dane dotyczące ładunku, nie ma potrzeby składania obietnicy/przyszłości. Po prostu użyj konstruktora asnyca _Fty && _Fnarg, _ArgTypes && ... _Args z moimi złożonymi argumentami. – rtischer8277