Unterdialog wir nach 5 sek. weiß......
-
Hi
Ich habe eine Dialogbasierte Anwendung. Nach dem Aufruf von einem Unterdialog (DoModal) kommt es zum Daten lesen (ziemlich viele) von eine Datenbank - und sehe da… jedes mal na ca. 5 Sekunden wir das Fenster komplett weiß
bis die Daten-Leseprozedur zu Ende ist!Schock! Weiß jeemand wie ich gegen dieser "weisser Erscheinung" vorgehen soll?

Danke für Hilfe
Adam
-
Das hängt damit zusammen, dass Deine Anwendung in dieser Zeit keine Nachrichten mehr verarbeitet, was ab Vista zu einem weißen Fenster führt.
Es könnte helfen, während der Verarbeitung der Daten ab und zu mal AfxGetApp()->PumpMessage() aufzurufen.
-
Wäre eine Lösung aber noch besser sind dann Threads.
SChau mal in die FAQ den dort findest Du passendes dazu.
-
so weit so gut...
- unter win xp passiert das gleiche...

- implementieren von AfxGetApp()->PumpMessage() hilf nur teilweisse dh. das Fenster wird nicht mehr "ganz in weiß" aber nur teil der Steuerelemente wird gezeigtich glaube, daß ich ohne threads nicht weiter kommen kann.
da auch meine bitte... auf grund daß mir die Technik mit pararellen Abläufen Neuland ist, kannt ihr mir bitte link posten wo ich einen einfachen Beispiel durchchecken kann. Die, die ich bist jetzt gefunden habe sind so geschrieben, daß ich nur Bahnhof verstehe...
Es gehr NUR um das: Daten lesen von Datenbank und in einen CListCtrl rein packen UND das Ganze in einen Thread laufen lassen.
grüsse
-
Variante a) dirty
Dieses Stück Source regelmäßig aufrufen. Je häufiger umso besser
MSG msg; // window message while (PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); }Besser, allerdings kein Zugriff auf die Klasse oder den Dialog, alle Daten zum arbeiten müssen im Pointer übergeben werden.
UINT Main_Thread(LPVOID ptr) { return 0; } AfxBeginThread(Main_Thread, NULL);Alternativ mit Trick.
Der Thread kann auf die Klasse zugreifen. Das geht aber nur, wenn der Thread statisch istFolgende Funktion zum Dialog hinzufügen:
static UINT MainThread(LPVOID ptr);UINT CDialog1::MainThread(LPVOID ptr) { CDialog1* parentDialog = (CDialog1*) ptr; parentDialog->MessageBox("Es ist kein Standard-Skript definiert!", "Fehler #03"); return 0; } AfxBeginThread(MainThread, this);Ich hoffe das hilft
Stefan
-
dein beispiel is richtig aber für den Messageloop würde ich empfehlen:
MSG msg; while( ::PeekMessage( &msg, NULL, NULL, NULL, PM_NOREMOVE ) ) ::AfxGetThread()->PumpMessage();um Spezialitäten des Messageroutings (z. B. die Reaktion auf Messages mit PreTranslateMessage und die Idle-Verarbeitung) nicht zu verlieren. Des weiteren würde ich keinen zeiger auf ein Dialog in einen Thread übergeben, eher alle benötigten Sachen in einer struktur übergeben und wenn man auf den Dialog zugreifen will, würde ich ein Handle auf diesen übergeben, is sicherer.
Gruß Matthias
-
Hallo StefanKittler! Hallo CTecS!
Das erste "dirty" Variante funktioniert PERFECT !

Es ist genau das was ich gebraucht habe. Das Fenster hat sich beruhig und alles funktioniert wie es sein sollte. Vielen vielen Dank.Allerding um einen Threads zu realisieren, da bin ich noch zu blöd... da muss ich noch viel lehrnen.
Grüsse
Adam
-
Dann beschäftige dich mit Threads, wirst du brauchen und is der bessere Weg als der Messageloop.
Gruß Matthias
-
nimm mal das r weg... das sieht so nicht aus

im ernst. versuch das besser mit threads zu realisieren.
wenn jemand zum beispiel den button nochmal drückt oder den dialog schließt, passieren merkwürdige dinge. Abstürze z.B.
Stefan
-
Man muss keine Threads verwenden. Nur muss man wenn man eine eigene MessagePump verwendet auch die UI abgeschlatet werden (EnableWindow), damit eben keine Reentrance Effekte entstehen.