Discussion:
AfxPumpMessage aufrufen
(zu alt für eine Antwort)
Rudolf Meier
2008-07-26 09:44:20 UTC
Permalink
Hallo

Ich bastle gerade an einer Lösung, welche einen Socket öffnen soll und dann
warten soll, bis die Verbindung steht, bevor sie zurückkehrt. Das ganze muss
über einen Asynchronen Socket erfolgen (schnell als Hinweis: das mag nicht
so sinnvoll sein, ist aber jetzt für den Moment mal die Vorgabe... und es
ist ja auch nur ein Versuch... das eigentliche Problem ist das mit der
Nachrichtenschleife, das mal exemplarisch gelöst werden soll). Ich muss also
hier auf eine Nachricht warten in einem Funktionsaufruf drin! Das ganze ist
ein MFC Projekt. Jetzt, wie mache ich das? Kann ich PeekMessage +
AfxPumpMessage in einer Schleife aufrufen, bis die gewünschte Nachricht
eintrifft? Oder wie löst man sowas am einfachsten? Könnte es Probleme geben,
wenn man AfxPumpMessage aufruft, in einer Funktion drin, welche grob gesagt
selber von AfxPumpMessage aufgerufen wurde? (mal abgesehen von der
Möglichkeit Endlose Schleifen zu bauen).
Wenn das ganze nicht ginge, sähe ich nur die Möglichkeit, einen eigenen
Thread zu öffnen... weil dann könnte man ja den aufrufenden blockieren +
warten, bis die gewünschten Nachrichten im anderen verfügbar sind...

danke für Infos...
Rudolf Meier
Martin Richter [MVP]
2008-07-26 10:41:41 UTC
Permalink
Hallo Rudolf!
Post by Rudolf Meier
Jetzt, wie mache ich das? Kann ich PeekMessage +
AfxPumpMessage in einer Schleife aufrufen, bis die gewünschte Nachricht
eintrifft? Oder wie löst man sowas am einfachsten? Könnte es Probleme geben,
wenn man AfxPumpMessage aufruft, in einer Funktion drin, welche grob gesagt
selber von AfxPumpMessage aufgerufen wurde? (mal abgesehen von der
Möglichkeit Endlose Schleifen zu bauen).
Das größte Problem ist, dass Du verhindern musst, dass ein User in
dieser "inneren" Schleife erneut Controls auslöst.
D.h. Du musst wie bei einem modalen Dialog das Main Window disablen.
Oder einfach einen Dialog aufmachen und die Nachrichtenschleife laufen
lassen und verhindern das der modale Dialog schließt und dann noch einen
Timer anzeigen und einen Abbrechen... Was man alles so braucht.
Post by Rudolf Meier
Wenn das ganze nicht ginge, sähe ich nur die Möglichkeit, einen eigenen
Thread zu öffnen... weil dann könnte man ja den aufrufenden blockieren +
warten, bis die gewünschten Nachrichten im anderen verfügbar sind...
Wenn Du den aufrufenden Thread bockierst hast Du eine tote UI und keine
Refreshs. Das kann ja wohl keine Lösung sein.
Auch bei einem zweiten Thread müsstest Du das Main Windows disablen, in
eine eigene Nachrichtenschleife gehen und warten bis der Thread
terminiert...
--
Martin Richter [MVP] 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
FAQ: http://www.mpdvc.de Samples: http://www.codeproject.com
Rudolf Meier
2008-07-26 14:34:36 UTC
Permalink
Hallo
Jetzt, wie mache ich das? Kann ich PeekMessage + AfxPumpMessage in einer
Schleife aufrufen, bis die gewünschte Nachricht eintrifft? Oder wie löst
man sowas am einfachsten? Könnte es Probleme geben, wenn man
AfxPumpMessage aufruft, in einer Funktion drin, welche grob gesagt selber
von AfxPumpMessage aufgerufen wurde? (mal abgesehen von der Möglichkeit
Endlose Schleifen zu bauen).
Das größte Problem ist, dass Du verhindern musst, dass ein User in dieser
"inneren" Schleife erneut Controls auslöst.
D.h. Du musst wie bei einem modalen Dialog das Main Window disablen. Oder
einfach einen Dialog aufmachen und die Nachrichtenschleife laufen lassen
und verhindern das der modale Dialog schließt und dann noch einen Timer
anzeigen und einen Abbrechen... Was man alles so braucht.
Ok, aber mal nur theoretisch... wär's möglich, dass ich das sogar zuliesse,
oder würde das einen Teil vom MFC durcheinander bringen?
Wenn das ganze nicht ginge, sähe ich nur die Möglichkeit, einen eigenen
Thread zu öffnen... weil dann könnte man ja den aufrufenden blockieren +
warten, bis die gewünschten Nachrichten im anderen verfügbar sind...
Wenn Du den aufrufenden Thread bockierst hast Du eine tote UI und keine
Refreshs. Das kann ja wohl keine Lösung sein.
Auch bei einem zweiten Thread müsstest Du das Main Windows disablen, in
eine eigene Nachrichtenschleife gehen und warten bis der Thread
terminiert...
Schön wär's nicht, das stimmt... aber z.B. bei Sockets gibt's ja sowas auch,
dass man blockierende verwenden kann... es muss ja nicht immer ein UI
vorhanden sein... für einen Server ginge das vielleicht...

Rudolf
Martin Richter [MVP]
2008-07-26 15:48:18 UTC
Permalink
Hallo Rudolf!
Post by Rudolf Meier
Ok, aber mal nur theoretisch... wär's möglich, dass ich das sogar zuliesse,
oder würde das einen Teil vom MFC durcheinander bringen?
Nöö... Du musst Dir nur klar sein, dass die Applikation nicht mehr Idle
wird. Temporäre Maps werden nicht mehr gelöscht, aber das ist alles
Pippifax...

Problematisch kan es nur sein, dass der User die selbe aKtion aufdie Du
wartest wieder ausführt, oder er Dinge verändert, die jetzt nicht
verändert werden dürften...
Post by Rudolf Meier
Schön wär's nicht, das stimmt... aber z.B. bei Sockets gibt's ja sowas auch,
dass man blockierende verwenden kann... es muss ja nicht immer ein UI
vorhanden sein... für einen Server ginge das vielleicht...
Wenn keine UI vorhanden ist kannst Du mit Deinen Messageloops machen was
Du auch immer willst...
--
Martin Richter [MVP] 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
FAQ: http://www.mpdvc.de Samples: http://www.codeproject.com
Rudolf Meier
2008-07-28 09:18:32 UTC
Permalink
ok, danke...

Rudolf

Loading...