Chciałbym wywołać wywołanie funkcji w jeden sposób. Jaki jest najlepszy sposób na to w Boost/C++?Zwiększ: Ogień i zapomnij asynchroniczne wywołanie funkcji?
Chciałbym przekazać dwa parametry i nie potrzebuję wyniku.
Chciałbym wywołać wywołanie funkcji w jeden sposób. Jaki jest najlepszy sposób na to w Boost/C++?Zwiększ: Ogień i zapomnij asynchroniczne wywołanie funkcji?
Chciałbym przekazać dwa parametry i nie potrzebuję wyniku.
Być może chcesz emitować sygnał?
Bardzo podobały mi się funkcje sygnałów i gniazd Qt, a także wiem, że Boost ma również sygnały/gniazda. Nigdy jednak nie użyłem sygnałów/slotów w Boost.
Cóż, możesz zakręcić wątek, a potem już nigdy się do niego nie przyłączać. Coś jak:
boost::thread some_thread(&SomeFunction, param1, param2);
Gdy zmienna some_thread wykracza poza zakres, wątek wykonania zostanie odłączony i nie będzie mógł być ponownie połączone. To marnowanie czasu na zakręcenie wątku, chyba że czas przetwarzania tej funkcji jest znaczący.
Nie używałem boost :: wątek na jakiś czas, ale widzę szybki przykład na documentation page for the class:
void find_the_question(int the_answer);
boost::thread deep_thought_2(find_the_question,42);
wierzę, jak tylko zakończy funkcję, wątek zostanie zamknięty. To może nie być to, czego chcesz w tym, że gdy wątek wykracza poza zakres, zostanie zniszczony. Jeśli to nie zadziała, prawdopodobnie musisz utworzyć długo działającą pulę wątków, a następnie przekazać funktory jako kompozycje boost :: bind.
W zależności od tego, jak często to robisz, najlepiej byłoby utworzyć pulę wątków wraz z kolejką roboczą. Tworzenie wątku może generować wiele kosztów, jeśli próbujesz zrobić to dziesiątki razy na sekundę. Jeśli nie dbasz o wartość zwrotu, to czyni to naprawdę łatwym.
Zakręć wątek lub dwa (lub dziesięć); mieć wątkową kolejkę funktorów do wywołania (powiązać parametry z funkcją i umieścić ją w kolejce); wątki czekają w kolejce, aby coś się pojawiło, pierwszy wątek do przebudzenia dostaje do przetworzenia pracy. Kiedy wątek zakończy zadanie, czeka ponownie na kolejkę.
Zapoznaj się z this project, aby dowiedzieć się, jak to zrobić.
Oczywiście, jeśli wywołujesz tylko asynchroniczne połączenia co kilka sekund w celu poprawy reakcji interfejsu użytkownika, łatwiej będzie po prostu rozpocząć nowy wątek za każdym razem.
Jedyny problem polega na tym, że może nie działać asynchronicznie, a jeśli tak, to prawdopodobnie potrzebuje pętli zdarzeń ustawionej na "wysłanie" sygnału do pętli. W przeciwnym razie wracasz do rzucania go na nitkę i zapominania o tym. –