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 gezeigt

    ich 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 ist

    Folgende 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



  • @StefanKittel

    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


  • Mod

    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.


Anmelden zum Antworten