Vc++: Bildschirmaktualisierung

Hallo,

ich hab mit vc++ 6 eine mfc-Anwendung erstellt und lasse, wenn ich auf einen Button klicke ein paar Rechnungen mit Daten aus Dateien durchführen. Der Prozess dauert ein bisschen länger, deshalb hab ich eine Progress-Bar mit eingefügt, die den Fortschritt auch schön anzeigt (mit m_progress1.SetPos(anz); UpdateData(FALSE):wink: soweit so gut. Alles wird schön angezeigt, solange man nichts macht. Schaltet sich aber jetzt der Bildschirmschoner ein oder man versucht, das Fenster zu bewegen, oder hat es kurzzeitig im Hintergrund, wird nichts mehr aktualisiert und man sieht nur noch ein weißes leeres Fenster. Erst, wenn die Berechnungen alle fertig sind, baut sich das Ganze wieder auf.
Ich hab von mfc so gut wie keine Ahnung, da ich bisher für Ein- und Ausgabe nur cin und cout benutzt hab und die Dokumentation von vc++ hat mich auch nicht sonderlich weiter gebracht.

Wie krieg ich das also hin, dass er den Bildschirm ab und an mal komplett aktualisiert?

Danke schonmal im Voraus für Hilfe.

cu R.T.

hi,
pack die Berechnungsroutinen in einen eigenen Thread. So kann sich der ursprüngliche Thread um die Aktualisierung der Bildschirmausgabe kümmern

lg

georg

Hi,

so weit so gut, ich hab jetzt die kompletten Berechnungen in einen eigenen Thread gepackt aber ein Problem gibt’s da noch: Wie aktualisiere ich jetz die progress-bar?

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

so weit so gut, ich hab jetzt die kompletten Berechnungen in
einen eigenen Thread gepackt aber ein Problem gibt’s da noch:
Wie aktualisiere ich jetz die progress-bar?

Übergib am besten dem Thread entweder die Klasse, die die Progressbar enthält oder einen Pointer auf die Progressbar(das Control) selbst. Dazu ist ja der void*/LPVOID Parameter beim Thread gedacht :wink:

bye
Christoph

Einfache Lösung:

Sorge einfach dafür, dass alle für Deine Anwendung anstehenden Windows-Messages verarbeitet werden, etwa in der Art:

/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
 Reicht alle Meldungen weiter.
 Rückgabe
 TRUE Message vorhanden.
 FALSE Keine Message vorhanden.
\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/

BOOL DispatchAllWM( void )
{
 MSG Message;
 BOOL bOK=FALSE;

 if( ::stuck\_out\_tongue:eekMessage( &Message, NULL, NULL, NULL, PM\_REMOVE )){
 ::TranslateMessage( &Message );
 ::smiley:ispatchMessage( &Message );
 bOK=TRUE;
 }
 return bOK;
}

Einfach während Deiner Berechnungen DispatchAllWM( ) aufrufen (nicht zu oft!!):

while( DispatchAllWM( ));

und die Oberfläche sollte aktuell bleiben.

Grüße Safog

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Einfache Lösung:

Sorge einfach dafür, dass alle für Deine Anwendung anstehenden
Windows-Messages verarbeitet werden, etwa in der Art:

/****************************************************************************
Reicht alle Meldungen weiter.
Rückgabe
TRUE Message vorhanden.
FALSE Keine Message vorhanden.
*****************************************************************************/

BOOL DispatchAllWM( void )
{
MSG Message;
BOOL bOK=FALSE;

if( ::stuck_out_tongue:eekMessage( &Message, NULL, NULL, NULL, PM_REMOVE )){
::TranslateMessage( &Message );
::smiley:ispatchMessage( &Message );
bOK=TRUE;
}
return bOK;
}

Einfach während Deiner Berechnungen DispatchAllWM( ) aufrufen
(nicht zu oft!!):

while( DispatchAllWM( ));

und die Oberfläche sollte aktuell bleiben.

Grüße Safog

Danke! Genau das hab ich gesucht.