Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: MFC (Visual C++) ::  c++ 11 async with MFC     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
async<void>
Unregistrierter




Beitrag async<void> Unregistrierter 09:56:16 09.02.2017   Titel:   c++ 11 async with MFC            Zitieren

Hallo

Versuche gerade mit std::async eine Funktion asynchron zu starten die unter anderem eine Funktion aufruft um auf der gui zu loggen. Sprich eine Listbox füllt.

Doch sobald ich einen Zugriff auf die Listbox mache hängt die Applikation

vereinfacht:

C++:
std::async([&](){ loglistbox_.AddString("Hallo Welt"); UpdateData();});



Wie bekomme ich denn das ganze asynchron hin ohne dass die GUI blockiert wird?
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 23276
Beitrag hustbaer Mitglied 10:37:54 09.02.2017   Titel:              Zitieren

Du kannst, generell gesprochen, GUI Updates nur im GUI Thread machen. Wenn du versuchst es aus nem anderen Thread zu machen, wird eines aus der folgenden Liste passieren:
1) Es geht, meistens, aber hin und wieder gibt es Probleme.
2) Es geht überhaupt nicht (Exception/Fehlercode).
3) Das Programm hängt sich weg (Deadlock).
4) Es geht indem der Aufruf an den GUI Thread weiter geleitet wird. Wenn der GUI Thread in dem Moment aber gerade keine Messages dispatcht, sondern z.B. darauf wartet dass der andere Thread fertig wird, dann hast du wieder Fall (3).

Einfache Möglichkeit: Neue Log-Messages in eine (synchronisierte) Queue stellen, und dem GUI Thread dann ne Nachricht posten dass es neue Log-Messages gibt.

_________________
Until every person can enjoy all their human rights, we will not stop. I support Amnesty International. Will you?
https://www.amnesty.org / https://www.amnesty.de / https://www.amnesty.at
EOP
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.09.2007
Beiträge: 1682
Beitrag EOP Mitglied 11:23:43 09.02.2017   Titel:              Zitieren

Wenn es um MFC geht verweise ich ja so gerne auf Flounder/Mr. Newcomer. Er zeigt dir wie es geht. Nicht nur in diesem Beitrag, du kannst auch sonst sehr viel von ihm lernen:
http://www.flounder.com/asynchexplorer.htm

_________________
The notorious bit shifter.
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 15229
Beitrag Martin Richter Moderator 13:30:06 09.02.2017   Titel:              Zitieren

Wieso willst Du es überhaupt asynchron machen?
Sind Deine Datenmengen wirklich so groß?

_________________
Martin Richter (MVP für C++ von 2000 bis 2015) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
async<void>
Unregistrierter




Beitrag async<void> Unregistrierter 13:00:09 16.02.2017   Titel:              Zitieren

wie gesagt der Code ist nur vereinfacht.

Ich verbinde mich in der Async Methode zu einem Sever das unter anderem etwas länge dauern kann. Dass loggen ist nur Nebenschauplatz.

Wieso das ganze hängt liegt wohl daran dass ich den Rückgabewert nicht auswerte bzw abspeichere.

C++:
result_ = std::async([&](){ loglistbox_.AddString("Hallo Welt"); UpdateData();});


Speichere ich mir mein result als member habe ich kein deadlock mehr.
Nichts desto trotz muss ich das loggen in die Listbox per Postmessage machen. Dann klappts.
async<void>
Unregistrierter




Beitrag async<void> Unregistrierter 13:08:10 16.02.2017   Titel:              Zitieren

Dürfte ich hierzu noch eine Frage stellen. In der async methode installiere ich zusätlich eine Callback die vom Server aufgerufen wird.

Die Callback benötigt aber eine Messageloop was natürlich über den async Befehl nicht gegeben ist.

Gibt es hier eine Lösung?
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 15229
Beitrag Martin Richter Moderator 18:16:10 16.02.2017   Titel:              Zitieren

async<void> schrieb:

Speichere ich mir mein result als member habe ich kein deadlock mehr.
Nichts desto trotz muss ich das loggen in die Listbox per Postmessage machen. Dann klappts.


Das ist resikant. Bist Du sicherm, dass der String auch bis zur Abarbeitung bestehen bleibt.
Ich würde in jedem Fall eine Queue nehmen und dann liber in einem Timer die Queue im UI Thread abarbeiten.
Solche Windows Nachrichten gehören einfach nicht in einen anderen Thread

_________________
Martin Richter (MVP für C++ von 2000 bis 2015) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
C++ Forum :: MFC (Visual C++) ::  c++ 11 async with MFC   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.