Interaktion mit dem BS
-
Hi!
Ich habe eine Klasse1, die von CDialog erbt und dazu eine Resource -> Das Fenster wird dann nicht modal erstellt, damit die aufrufende Klasse2 im Hintergrund Aktionen ausführen kann.Nun mein Problem: Wenn der Nutzer ein anderes Fenster einer anderen Anwendung öffnet (beispielsweise Klick in Taskleiste) oder das Fenster der Klasse1 verschiebt, wird das Fenster (Klasse1) nicht mehr aktualisiert und im Taskmanager steht das "Awendung reagiert nicht" (o.ä.).
Allerdings laufen die Aktionen der Klasse2 weiter und wenn diese beendet sind, läuft wieder alles.Wie also kann ich die Meldung "Awendung reagiert nicht" verhindern und das Fenster nach dem Verschieben wieder aktualisieren?
Danke
P.S. Ist das Thema vielleicht etwas für die FAQ?
-
Naja so wirds nix für die FAQ kann mir nichtmal vorstellen wie du des meinst
-
Weiß zwar auch nich so genau wie du dat meins, aber wenn er das programm schon abbricht, muss bereits was bei deiner klassenerstellung schief gelaufen sein. Oder du hast ein befehl eingegeben, der da nich hingehört.
-
bissl code ist auch immer hilfreich
-
Also: das Programm bricht nix ab sondern läuft so weiter, wie es soll (eine Schleife werkelt relativ lange).
Aber: während es das macht, steht im Taskmanager "Keine Rückmeldung".Ich muss also dem Betriebssystem sagen, dass mein Prog korrekt läuft.
Die Sache, dass das Fenster erst aktualisiert wird, wenn die gewisse Prozedur beendet ist, koppeln wir jetzt erstmal ab.
Ist dies nun eine bessere Beschreibung meines Probs?
-
Da war doch was mit "PeekMessage" und "PumpMessage", ich schau noch mal nach. Das hab ich letztens auch machen müssen, weil mein Proggie trotz des Abbrechen-Buttons im Hintergrund noch fertig gewerkelt hat...
Ich meld mich...
-
Für die FAQ ist es mal nichts da es bereits in der FAQ steht.
Thread oder selbst die Messages abholen.
Du hast da was vollkomen falsch verstanden wie Windowsprogramme arbeiten.
Einen Dialog nichtmodal aufrufen != Das Fenster erledigt alles im Hintergrund.
Ein Programm auch wenn es Nichtmodale Dialoge hat kann nur eine Befehlszeile nach der anderen abarbeiten. Nomalerweise erledigt das Messageabholen (WM_PAINT,etc) das Gerüst. NAchdem du aber Schleifen eingebaut hast gibst du dem Gerüst keien Change die Messages abzuholen. Da die Warteschleife voll wird mekt dies das BS und sagt "Dein Programm reagiert nicht"
-
Bau doch mal das ein:
// Pump the message queue MSG msg; while (::PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE)) AfxGetThread()->PumpMessage();
Bei mir klappts...
-
@Schwupi: Danke, war genau das, was ich wollte.
@Unix-Tom: Ich habe mich falsch ausgedrückt - mir war schon klar, dass nichts "im Hintergrund" passiert. Was ich eigentlich wissen wollte, war das, was du später schreibst, nämlich dass ich die Nachrichten abholen muss und wie ich das tue.
Aber in der FAQ hab ich das nicht gefunden, weil ich nicht wusste, wonach ich suchen sollte (Ich finde es ehrlich gesagt immer noch nicht).Thanks@all
Thommi
-
Am schönsten nach CWinThread
Dadurch läßt man dem den Rahmen das machen wofür er da ist. (Messageschleife,etc)