C++ std::async laufen auf Haupt-thread
Gibt es eine Möglichkeit der Ausführung einer Funktion zurück auf der main-thread ?
Also, wenn ich nannte eine Funktion über die Funktion Async, dass eine Datei heruntergeladen und dann analysiert die Daten. Es würde dann eine callback-Funktion aufrufen, die laufen würde auf meinem Haupt-UI-thread und die Aktualisierung der Benutzeroberfläche ?
Ich weiß, die threads sind gleich in der Standard-C++ - Implementierung, so würde ich erstellen, ein shared pointer auf meinem Haupt-thread. Wie kann ich dies tun, und übergeben Sie die Async-Funktion nicht nur der shared pointer zu den Haupt-thread aber auch ein Zeiger auf die Funktion möchte ich rrun auf es und führen Sie es auf das Haupt-thread ?
- Sie können einen callback anbieten mit
std::async
, müssen Sie die Umfrage für die Bereitschaft der Wert aus dem thread, der dich interessiert (oder aus einem anderen thread und die Nachricht der UI-thread). Natürlich könnten Sie wickeln die echte Funktion in einer anderen Funktion, die die Nachricht sendet, für Sie... - Sie können
get()
synchronisieren mit einem Faden. - Würde Signale arbeiten mit diesem ?
- Im Allgemeinen, Sie können nicht einfach eine Funktion auszuführen, in einem anderen thread. Wenn würde anderen thread ausführen? Die große Ausnahme ist das ausführen einer Funktion in einem neuen thread, oder eine freie Threads im threadpool. Sie sind per definition nicht läuft, alles andere, so dass Sie können führen Sie die Funktion jetzt.
- Würde mit der mainthread Umfrage der Zukunft eine praktikable Lösung, wenn ich also einen timer auf der Haupt-thread, dass heißt eine Funktion, die überprüft, ob eine Aktion schon gemacht wurde und rief dann der Rückruf mit der futures resultieren, würde das funktionieren ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich gelesen C++ Concurrency in Action und Kapitel vier (AKA "Das Kapitel habe ich Gerade Fertig") beschreibt eine Lösung.
Die Kurze Version
Haben ein gemeinsames
std::deque<std::packaged_task<void()>>
(oder eine ähnliche Art von Nachricht/task-queue). Ihrestd::async
gestartet-Funktionen, push-Aufgaben in die Warteschlange, und Ihre GUI-thread verarbeiten kann, Sie während Ihrer Schleife.Es Ist nicht Wirklich eine Lange Version, aber Hier Ist ein Beispiel
Gemeinsamen Daten
Die
std::async
- FunktionDer GUI-Thread
Hinweise:
Ich bin (immer) lernen, so gibt es eine gute chance, dass mein code nicht gut ist. Das Konzept ist mindestens Ton obwohl.
Den Destruktor der Rückgabewert von
std::async
(astd::future<>
) wird blockiert, bis der Betrieb gestartet mitstd::async
abgeschlossen (siehestd::async
), so wartet auf das Ergebnis einer Aufgabe (wie ich in meinem Beispiel) inone_off
könnte nicht eine geniale Idee.Möchten Sie vielleicht, um (würde ich zumindest) erstellen Sie Ihre eigenen threadsicher MessageQueue geben zur Verbesserung der code-Lesbarkeit/Wartbarkeit/blah, blah, blah.
Ich schwöre, es war eine weitere Sache, die ich hinweisen wollte, aber es entgeht mir jetzt.
Vollständiges Beispiel
Dat-Ausgang
Sind Sie auf der Suche nach
std::launch::deferred
? Die übergabe dieser parameter an std::async macht die Aufgabe ausgeführt, die auf den aufrufenden thread, wenn die get () - Funktion das erste mal aufgerufen.