Asynchrone Funktionsaufrufe
-
Hi,
ich suche gerade in Boost so was wie QtConcurrent::run von QT. Ich möchte asynchron Funktionen aufrufen, die in einem eigenen Thread gestartet werden ohne mich um Threadmgmt. zu kümmern. Das Ergebnis soll mir dann z.B. über ein Signal mitgeteilt werden.
"Asynchronous Function Call" und Konsorten führten mich zu boost::asio, was aber bei den ganzen Beispielen ständig mit TCP/IP oder UDP zu tun hat und anscheinend nicht für meine Zwecke dienlich ist.
Gibt es so was? Oder ist boost::thread weniger überladen als die Thread-Variante in QT (, die man nämlich erst mit einem Worker verbinden muss und zahlreiche Rand-Signale erstellen muss), sodass es in boost keine Existenzberechtigung für so was gibt?
Ich könnt mir jetzt selbst was zusammenfriemeln, aber ich frage lieber nach, um sicherzugehen, dass ich auch wirklich nicht etwas unnötig Ineffizientes baue.
Herzlichen Dank!
-
Du meinst sowas?
#include <thread> template <typename F, typename ReadyHandler> void async_call(F f, ReadyHandler ready_handler) { std::thread([f, ready_handler] { f(); ready_handler(); }).detach(); } void foo() { std::cout << "Working...\n"; std::this_thread::sleep_for(std::chrono::seconds(1)); } void handler() { std::cout << "Done.\n"; } int main() { async_call(foo, handler); std::this_thread::sleep_for(std::chrono::seconds(2)); }Finde ich aber nicht besonders schön.. sag mal was genau du machen willst.

-
Ich kenne Qt nicht gut genug, aber deine Beschreibung klingt mir sehr nach den Futures und Promises aus C++11. Diese sind mWn einer der wenigen Teile der C++11-Threads, die es so in Boost nicht gibt
.edit: Zu langsam.
-
std::async
-
cooky: Genau, so was!
Okay, die Futures sind das, was ich will, vielen Dank.

Klappt das mit MSVC2010 bereits (reibungsfrei), wisst ihr das auch noch? Oder ab welcher Version?
Genau machen will ich eine Funktion aufrufen, die ziemlich lange dauert. Der Benutzer soll aber den Vorgang abbrechen können oder währenddessen irgendwas anderes mit meinem tollen Programm machen können. Und da es sich tatsächlich nur um einen einfachen asynchronen Funktionsaufruf handelt und nicht etwa um einen nebenläufigen Thread, der brav alle paar Minuten einen neuen Kaffee kocht oder so, hielt ich Threads für etwas overheaded und darum möglicherweise unnötig fehleranfällig (das ist ja die Standardbegründung dafür, dass es futures und promises überhaupt gibt, schätze ich).
-
SeppJ schrieb:
[...] Diese sind mWn einer der wenigen Teile der C++11-Threads, die es so in Boost nicht gibt

Sind die futures und promises in boost anders, als die in C++11?
-
Tachyon schrieb:
SeppJ schrieb:
[...] Diese sind mWn einer der wenigen Teile der C++11-Threads, die es so in Boost nicht gibt

Sind die futures und promises in boost anders, als die in C++11?
Nein, meines Wissens sind die ziemlich gleich.
-
Aber irgendwie finde ich zu boost-future keine Doku, nur den Header?
Ich saß gerade zu lange vor der IDE, sagt Mal kurz, ob ich hier logisch richtig liege: Bei QT kann man ja einen asynchronen Funktionsaufruf mit signals/slots kombinieren, sodass ein slot aufgerufen wird, wenn der Funktionsaufruf beendet wurde. Das geht bei boost aber nicht, weil es ja keine Main/Eventloop gibt, sodass die Abfrage, ob Thread fertig ist, ja gar nicht von irgendwem regelmäßig getätigt werden kann, richtig?
Schlimm ist das nicht, muss man halt eine eigene Eventloop basteln oder eben auf Anfrage Thread-Progress-Status abrufen.
-
Eisflamme schrieb:
Aber irgendwie finde ich zu boost-future keine Doku, nur den Header?
Das gehört zu boost.thread und befindet sich dort bei den Synchronisationsmechanismen. Da sollten sogar einige Beispiele bei sein.
Edit: Hier gibts das...
-
Ah, cool, danke
Hab ich wohl zu sehr auf Google vertraut und daher in thread zu oberflächlich gesucht.