2008-09-30 6 views

Antwort

0

Vielleicht möchten Sie ein Signal aussenden?

Ich mochte Qt's Signale und Slots Funktionalität, und ich weiß Boost hat auch Signale/Slots. In Boost habe ich noch nie Signale/Slots benutzt.

+0

Das einzige Problem dabei ist, dass dies möglicherweise nicht asynchron funktioniert, und wenn dies der Fall ist, dann muss wahrscheinlich eine Ereignisschleife eingerichtet werden, um das Signal in die Schleife zu "posten". Sonst bist du zurück, es einfach auf einen Faden zu werfen und es zu vergessen. –

3

Nun, Sie können einen Thread hochdrehen und dann nie wieder beitreten. Etwas wie:

boost::thread some_thread(&SomeFunction, param1, param2); 

Sobald die some_thread Variable den Gültigkeitsbereich verlässt, wird der Thread der Ausführung gelöst werden und nicht in der Lage sein, wieder verbunden werden. Es ist eine Verschwendung, einen Thread hochzufahren, wenn die Verarbeitungszeit dieser Funktion nicht signifikant ist.

3

ich nicht boost verwendet haben :: Thread in eine Weile, aber ich sehe ein kurzes Beispiel auf dem documentation page for the class:

void find_the_question(int the_answer); 

boost::thread deep_thought_2(find_the_question,42); 

ich so schnell glauben, wie es die Funktion beendet ist, wird der Faden verlassen. Dies ist möglicherweise nicht das, was du willst, sobald der Thread den Rahmen verlässt und zerstört wird. Wenn das nicht funktioniert, müssen Sie wahrscheinlich einen lang laufenden Thread-Pool erstellen und dann Ihre Funktoren als boost :: bind-Kompositionen übergeben.

1

Je nachdem, wie oft Sie dies tun, sollten Sie am besten einen Pool von Threads zusammen mit einer Arbeitswarteschlange erstellen. Das Erstellen eines Threads kann viel Aufwand verursachen, wenn Sie es Dutzende Male pro Sekunde versuchen. Wenn Ihnen der Rückgabewert egal ist, ist das wirklich einfach.

Spin ein Thread oder zwei (oder zehn); eine Thread-sichere Warteschlange von Funktoren haben, die aufgerufen werden sollen (die Parameter an die Funktion binden und diese in die Warteschlange setzen); Die Threads warten auf die Warteschlange, damit etwas angezeigt wird. Der erste Thread, der aufwacht, kann die Arbeit verarbeiten. Wenn ein Thread einen Job ausgeführt hat, wartet er erneut auf die Warteschlange.

Werfen Sie einen Blick auf this project für eine Idee von einer Möglichkeit, es zu tun.

Wenn Sie alle paar Sekunden nur asynchrone Anrufe durchführen, um die Reaktion einer Benutzeroberfläche zu verbessern, ist es einfacher, einfach jedes Mal einen neuen Thread zu starten.

Verwandte Themen