Fenster neu zeichnen?
-
Hallo,
mein Problem ist, dass mein Programm eine Arbeit erledigt, welche recht CPU lastig ist. Durch eine Progressbar zeigt das Programm den Fortschritt an. Doch da es zum aufhängen der Oberfläche kommen kann, (also eigentlich reagiert das Programm erst wieder, wenn die Aufgabe erledigt ist) wird die Progressbar nicht immer aktualisiert. Mal taucht sie gar nicht auf, mal wird sie zwischen drin nicht aktualisert. Aber manchmal läuft es komplett durch.Hab in der MSDN schon nachgeschaut und
Form1::Refresh();
gefunden. Doch wenn ich das einsetze, ändert sich nicht großartig etwas. Benutze ich es zu oft, wird mein Programm sogar noch viel langsamer und zeigt gar keine Progressbar mehr an. Habe dann noch dieses hier versucht:
ProgressBar->Control->Refresh();
Hat aber auch nichts gebracht.
Wisst Ihr vllt, was ich da machen kann, damit mein Prog regelmäßig das Fenster neuzeichnet? Sollte aber auch nicht zu aufwendig sein.
-
Application.DoEvents() regelmäßig aufrufen oder Arbeit in einem externen Workerthread auslagern.
-
Dabei bitte ab folgenden Post den Thread durchlesen:
http://www.c-plusplus.net/forum/viewtopic-var-p-is-1477626.html#1477626
-
Danke für die schnellen Antworten.
Mit den DoEvents() wird das Fenster immer neu aufgebaut und funktioniert. Nach esten Tests, hab ich auch noch keine Laufzeitänderung bemerkt.
@Knuddlbaer
Du willst mir also dazu raten, lieber mit Threads zu arbeiten? Daran habe ich auch schon gedacht. Nur weiß ich noch nicht wie ich das mit VC++ und .Net realisieren kann.
Werde auf jeden Fall noch ein Paar Tests machen, falls mein Prog in einem extremeren Fall doch mehr Zeit brauchen sollte, und mir die Sache mit Threads anschauen.
-
Arbeite mit Threads. Das sollte aus dem von Knuddelbär verlinkten Post ersichtlich sein.
-
Du findest im Forum auf den ersten 3 Seiten ein paar Beiträge zu C++ und Threads die Dir das Einarbeiten erleichtern. (Unter C++/CLI finde ich die Syntax gegenüber C# etwas ... Naja, komplex/schwer so in die Richtung)
-
Hey vielen Dank. Werd ich mir mal anschauen
-
pharmacy;
-
pharmacy;
-
schon mal mit Invalidate() versucht, ist eine von Control geerbte methode und zwingt das objekt zur neuzeichnung, falls ich es hier richtig verstanden habe.