Eines meiner Programme ist das Abhören und Empfangen von Payloads von einem Socket. Ich möchte nie blocken. Für jede empfangene Nutzlast möchte ich ein Objekt erstellen und es an einen Worker-Thread übergeben und es später vergessen, so wie der Prototyp-Code funktioniert. Aber für den Produktionscode möchte ich die Komplexität reduzieren (meine App ist groß), indem ich die bequeme Async-Methode verwende. async nimmt eine Zukunft, die aus einem Versprechen gemacht wird. Damit das funktioniert, muss ich ein Versprechen für mein Nicht-POD-Objekt erstellen, das unten durch die Xxx-Klasse repräsentiert wird. Ich sehe keine Möglichkeit, dies zu tun (siehe Fehler in meinem Beispielcode unten). Ist es angemessen, hier Async zu verwenden? Wenn ja, wie kann ich ein Versprechen/future-Objekt erstellen, die komplexen als int (alle Code-Beispiele Ich habe sehen entweder Verwendung int oder void):kann ein std :: promise von einem Nicht-POD-Objekt gemacht werden?
#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;
}
Haben Sie versucht, 'Xxx' eine Standard-Ctor geben? – Angew
Warum gibst du 'xxx' nicht einfach an die asynchrone Funktion? Brauchen Sie wirklich die Zwei-Wege-Zukunft Kommunikation? Das bedeutet nur, dass beide Threads aufeinander warten. –
Ich verstehe. Da ich bereits die Nutzlastdaten habe, ist es nicht nötig, ein Versprechen/eine Zukunft daraus zu machen. Verwenden Sie einfach den _Fty && _Fnarg, _ArgTypes && ... _Args -Konstruktor von asnyc mit meinen komplexen Argumenten. – rtischer8277