Einfrieren der Benutzeroberfläche bei aufwendigen Operationen verhindern


Wenn Sie in Ihrem Programm aufwendige (langwierige) Operationen durchführen, ist in der Regel die Benutzeroberfläche blockiert, da das komplette Programm in einem einzigen Thread abläuft und wärend der Berechnung die CPU- Zeit nur für die Berechnung verwendet wird. Wenn das Fenster z.B. minimiert und dann wieder maximiert wird, dann wird das Fenster unvollständig dargestellt. Ebenso wenn Sie ein anderes Fenster über dieses schieben und wieder zurück schieben. Dann ist die Überlappung einfach weiß.
Falls man eine ProgressBar oder andere Fortschrittsindikatoren verwendet, müssen diese im Laufe der Berechung aktualisiert werden.

Als (elegante, aber aufwendige) Lösung könnte man zwei Threads verwenden. Einen für die Benutzeroberfläche und einen zweiten für die Berechnung. Dann sorgt das Betriebssystem dafür, dass jeder Thread einen Teil der CPU- Zeit zugewiesen bekommt. In dieser Zeit kann dann der Thread der Benutzeroberfläche diese aktualisieren.

Eine einfachere Lösung ist das Verwenden von "Application.ProcessMessages". Dieser Aufruf bewirkt ein Abarbeiten der Nachrichtenschlange (dort stehen z.B. gedrückte Tasten, Mausaktionen, alles was mit dem Fenster zu tun hat, etc.). Wenn Sie diesen Befehl z.B. in Ihre Schleife einfügen, in der die aufwendige Operation durchgeführt wird, dann wird bei jedem Schleifendurchlauf die bis zu diesem Zeitpunkt aufgetretenen Nachrichten verarbeitet und somit auch die Benutzeroberfläche aktualisiert.