2008-09-30 14 views

Odpowiedz

0

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.

+0

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. –

3

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.

3

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.

1

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.