Autor Beitrag
chip777
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: Fr 23.04.10 13:37 
Hi,

in meinem Programm habe ich einige Dinge die sehr lange laden, deshalb habe ich eine MessageBox eingebaut, welche darauf hinweist. Allerdings ist es dann so das nach dem Klick auf OK zwar der Vorgang startet, allerdings die MessageBox nicht richtig verschwindet, dass heißt diese ist noch solange sichtbar bis der Vorgang abgeschlossen ist.
Wie kann ich das verhindern?

Martin
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 23.04.10 14:22 
Du musst dem System zwischen ausblenden der MessageBox und starten des Vorgangs (wenn es ein Vorgang ist der im GUI Thread läuft) einmal die Chance geben sich neu zu zeichnen bzw. einmal die Abarbeitung der Events zum neuzeichnen zulassen. Das geht z.B. mit einem einmaligen Aufruf von Application.DoEvents() direkt nach deinem MessageBox.Show().
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Fr 23.04.10 14:30 
Du kannst aber auch die rechen intensive Methode in einen Thread auslagern. Dann könntest du auch einen Fortschrittbalken etc. anzeigen.
chip777 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 127

Win 7 Prof
C# VS 2008
BeitragVerfasst: Fr 23.04.10 14:55 
Super,

Application.DoEvents() erfüllt den Zweck. Das mit dem extra Thread und der ProgressBar wäre natürlich um einiges besser, allerdings weiß ich nicht ob ich das hinbekomme. Die Funktion die solange braucht ist in einer Methode untergebracht, kann ich die relativ einfach in einen extra Thread packen und mit einer Progress Bar verknüpfen?

Ich hab schonmal versucht etwas mit einer ProgressBar zu machen, aber das hat nicht geklappt, weil die Apllication immer "gestanden" hat, weil ich den Application.DoEvents() Befehl noch nicht kannte.
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Fr 23.04.10 16:06 
Du kannst einfach einen BackgroundWorker verwenden. Dem weißt du ein EventHandler zu (DoWork) und dann macht er die Methode im Hintergrund. Wenn du eine ProgressBar dazu haben willst, musst du halt in deiner rechenintensiven Methode Events werfen, die dan aktuellen Bearbeitungsstand anzeigen. Aber fürs erste würde ich mal den BackgroundWork einsetzen.

PS: Pass aber auf, dass der Benutzer dann weiterhin eingaben machen kann und ggf. den Prozess nochmal starten und es dann zu Problemen kommen kann.