Weißer Bildschirm

tinopolis

Mitglied
Hallo alle zusammen,

habe einige sehr rechenintensiven Aktionen im Programm (MDI-Anwendung).
Beim Starten dieser Aktionen öffne ich einen Dialog mit Fortschrittsanzeige.
Sie auch toll aus. Auf einigen anderen Rechnern erscheint erst der Fortschrittsbalken und nach einigen Sekunden sind die Anwendung und der Dialog nur noch weiß.

Einer 'ne Ahnung ?

Gruß
tino
 
Du packst die rechenintensiven Funktionen doch hoffentlich in einen eigenen Thread?
 
Nein, in diesem Fall nicht.

Die Routinen für den Fortschrittsbalken werden ja auch durchlaufen und so lange dieser Ablauf nicht durch ist, soll das Programm nichts anderes tun.
Außerdem muss man bei der Verwendung von Threads einiges bei der Programmierung beachten. Man muss ja nicht gleich mit Kanonen auf Spatzen schießen. Der Fortschrittsbalken ist ja nunmal dafür da, dem Benutzer eine länger dauernde Aktion zu visualisieren.

Gruß
tino
 
Wenn du schon keinen Thread verwendest, kannst du aber innerhalb der rechenintensiven Aktionen den untenstehenden Codeschnipsel regelmäßig ausführen. Damit werden die anstehenden Events verarbeitet (u.a. für's Zeichen der Fenster), die sonst durch die Rechenroutinen blockiert werden.
C++:
MSG msg;

while ( ::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE ) )
{   
    if ( ::GetMessage(&msg, NULL, 0, 0)) 
    {
      ::TranslateMessage(&msg);
      ::DispatchMessage(&msg);
  }
  else
  {
      break;
  }
}

Gruß
MCoder
 
Durch die Verwendung von Threads kannst du ja trotzdem einen Fortschrittsbalken verwenden. Das eine schließt das andere ja nicht aus. Zudem wäre es designtechnisch wesentlich schöner, rechenintensive Abläufe in einen Thread zu packen, welcher durch Events beispielsweise den Fortschritt liefert.
Der zusätzliche Aufwand wird sich in diesem Fall wohl in Grenzen halten.
 
Da ist mir ja auch klar,

leider handelt es sich hier um ein sehr altes Projekt. Nicht so sauber programmiert und strukturiert. Wir waren gerade gezwungen an einigen Stellen Berechnungen in Threads zu verwenden. Seitdem häufen sich die Abstürze, deshalb bin ich da sehr vorsichtig.

Aber MCoder, du meinst das die Aktualisierungs-Routinen nicht durchlaufen werden ? Aber wiieso funktioniert das an einigen Rechnern und an anderen nicht ?

Gruß
tino
 
Aber MCoder, du meinst das die Aktualisierungs-Routinen nicht durchlaufen werden ? Aber wiieso funktioniert das an einigen Rechnern und an anderen nicht ?
Schwer zu sagen, hängt möglicherweise mit der Rechnerperformance zusammen.

Fakt ist, wenn die Aktualisierungsroutinen eine Änderung der Ausgabe (Fortschrittsbalken) bewirken sollen, läuft das im Endeffekt auf eine WM_PAINT Message an das jeweilige Fenster hinaus. Wenn die rechenintensiven Vorgänge die gesamte Rechenleistung des aktuellen Threads beanspruchen, wird das Message-Handling zumindest stark gebremst. Wenn du also nach den Aktualisierungsroutinen den von mir geposteten Code einfügst, sollte es (hoffentlich) besser funktionieren, weil damit anstehende Messages verarbeitet werden können.

Gruß
MCoder
 
Zurück