Uygulamamın yaptığı şeylerden biri, bir soketten gelen yükleri dinleyip almak. Asla engellemek istemiyorum. Alınan her yük üzerinde, bir nesne oluşturmak ve onu bir çalışan iş parçacığına aktarmak ve prototip kodunun nasıl işlediğini daha sonraya kadar unutmak istiyorum. Ama üretim kodu için uygun async yöntemini kullanarak karmaşıklığı (benim app büyük) azaltmak istiyorum. Async bir sözden yapılan bir geleceği alır. Bunun çalışması için aşağıda Xxx sınıfı tarafından temsil edilen POD olmayan nesnem üzerinde bir söz yaratmam gerekiyor. Bunu yapmanın bir yolunu görmüyorum (aşağıdaki örnek kodumdaki hatayı okuyun). Burada uyumsuzluk kullanmak uygun mu? Eğer öyleyse, ben int daha karmaşıktır bir söz/gelecekteki nesne oluşturmak nasıl (tüm kod örnekleri ben kullanım int ya da void bkz ettik): En uygulaması kusurlu gibibir std :: POD olmayan bir nesneden yapılacak söz verebilir mi?
#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;
}
Varsayılan olarak bir "Xxx" vermeyi denediniz mi? – Angew
Neden "xxx" ifadesini async işlevine geçirmiyorsunuz? İki yönlü "geleceğin" iletişimine gerçekten ihtiyacın var mı? Bu sadece her iki dişin birbirini beklediği anlamına gelir. –
Anladım. Zaten yük veriye sahip olduğum için, bir söz/gelecek vaat etmeye gerek yok. Karmaşık argümanlarımla asnyc'in _Fty && _Fnarg, _ArgTypes && ... _Args yapıcısını kullanın. – rtischer8277