Wywołanie w async() metody na rzecz obiektu i przekazanie argumentów

0

Potrzebuję zrobić coś w osobnym wątku natomiast metoda którą chcę wywołać jest zdefiniowana i zaimplementowana innej bibliotece z której tylko korzystam.
Moje pytanie jest takie, czy mogę sobie wywołać jakoś w funkcji async() metodę na rzecz obiektu który tworzę?
Jaśniej mówiąc teraz mam coś takiego:

std::future<int> retValue = std::async(myFunction, arg1);

Czyli funkcja + jakiś argument do niej.

Natomiast ja chciałbym osiągnąć coś takiego:

NameClass obj;

std::future<int> retValue = std::async(obj.myFunction, arg1);

Stworzyć sobie obiekt klasy i wywołać w async() metodę na rzecz tego obiektu, która coś mi zwróci jak się wykona. Da się tak?

1

Probowales:

async(&myclass::mymethod, myobj, arg1)

Jak nie zadziala, to zawsze mozesz uzyc binda.

2

aż się prosi o lambdę.
http://ideone.com/lIBnXH
Błąd wykonania wynika z tego, że ideone nie pozwala na wielowątkowość.
U mnie z clang działa, tak samo tutaj (ale nie ma permalink).

Bez lambdy też się da:
http://ideone.com/4XBuOi
Czyli twój przykład może wyglądać tak:

std::future<int> retValue = std::async(&NameClass::myFunction, &obj, arg1);
// albo tak:
std::future<int> retValue = std::async([&obj] {return obj.myFunction(arg1); } );

Osobiście wolę lambda.

0

Ok, dzięki, to mi poszło.

Dalej ciągnąc ten temat mam następujące pytanie. Mam 2 programy klienta i serwera. Wysyłam coś sobie do serwera i czekam aż odpowie.
Teraz chciałbym sobie zrobić wątek, który będzie działał w tle i np. jeżeli serwer nie odpowie przez 10 sekund to połączenie zostanie
przerwane przez klienta.
Czyli tak, wysyłam sobie normalnie wiadomość na konkretny port do serwera.

//wysylam
objClient.send(msg, size);

//pobieram czas zaraz po wyslaniu
auto time = std::chrono::system_clock::now() + std::chrono::seconds(10);

//i teraz to receive() w wątku
std::future<string> msgRecv= std::async([&objClient] {return objClient.receive(); });

//no i dalej, oczekiwanie okreslna ilosc czasu
std::future_status s = msgRecv.wait_until(time);

if(s == std::future_status::ready){
  msgRecv.get();
  //cos tam dalej robie
}
if(s == std::future_status::timeout){
  ...
}

Czy to się da w taki sposób zrealizować, bo obecnie przy takim kodzie dostaję pustą wiadomość od serwera. Jakieś rady jak to ugryźć mile widziane.
Czy send i receive muszą wspóldzielić wątek, aby wiadomość dotarła?

1 użytkowników online, w tym zalogowanych: 0, gości: 1