Fenster aktualisierst sich nicht?
-
Habe ein custom Control, in dem eine Grafik geladen wird. diese Control befindet sich im Hauptfenster. Im Konstruktor des Kontrols wird nach der Controls initalisierung schleif durchlaufen was einige Sekunden dauert. Nun hab ich ein Progressbar eingebaut welche sich währende dem schleifendruchlauf expandieren soll. selbst wenn ich "invalidate()" des Custom controls aufrufe ändert sich nicht, selbst das hautpfesnter aktualiserst /zeichent die restlichen controls erst wenn die schleifen durchlaufen wird.
Ich dachte "invalidate erwzing eine NEuzeichung/aktualisierung eines fensters/Controls"??
Als Beispiel der konstruktor des Custom Controls:
Public Sub New(ByVal SystemID As Integer) MyBase.New() Me.SystemID = SystemID 'This call is required by the Windows Form Designer. InitializeComponent() Dim CurSystem As DBTableData = New DBTableData 'Daten der Anlage lesen iHandler = CurSystem.GetDeduceData(SystemID, "HANDLER").Count ' ReDim rcHandler(iHandler) iModule = CurSystem.GetDeduceData(SystemID, "MODULS").Count ' ReDim rcModule(iModule) Loading.Visible = True Loading.Minimum = 0 Loading.Maximum = iHandler + iModule 'Systemview Grafikelemente (Zeichen Rechtecke erzeugen) Me.calc_HandlerRectangles() Me.calc_ModulRectangle() Loading.Visible = False 'Add any initialization after the InitializeComponent() call End Sub
die funktionen "calc_HandlerRectangles()" und "calc_Modulrectangels" erhöhen den Loading.Value des Progerssbars, darin sind auch die "invalidates" enthalten!
-
Oh mann, immer wieder dieselben Fragen und Probleme. Des Ding aktualisiert sich nicht, weil Du Deine Schleife im selben Thread abarbeitest. Schau' Dir den BackgroundWorker an, der behebt das "Problem".
-
naja aber würde ich bei jedem schleifendurchlauf "invalidate" aufrufen , oder das paint event aufrufen müsste es doch gehen! Bei c++ geht das... extra nen workertrhead ohje
-
Du hast es doch so gemacht, oder? Und, geht es? Na also, dann geht's wohl nicht. Und ein Workerthread ist eine feine Sache, vor allem wenn Du ein Mehrkern- oder ein Mehrprozessorsystem hast, dann läuft der Kram unter Umständen parallel und schon ist Deine Anwendung schneller .... Ich glaube, Du solltest Dir zu Deinem Projekt noch ein paar konzeptionelle Gedanken machen oder es an Profis abgeben.
-
dürfte ich es mit C++ machen kein thema, aber ich muss mich halt mit VB.NET bullshit rumärgen... Was ein thread ist udn was die machen ist mir klar..
muss jetzt nur checken wie ich das Trhead finished event abfangen kann (falls es so was gibt in .net)
-
BorisDieKlinge schrieb:
Was ein thread ist udn was die machen ist mir klar..
Also des habe ich eh vorausgesetzt.
Ich habe Dir den BackgroundWorker empfohlen, wenn Du Dir den mal 5 min angeschaut hättest, wärste über drei nette Events gestolpert:
- DoWork
- ProgressChanged
- RunWorkerCompletedLeichter geht's nimmer, also stell' Dich net so an oder lass' es sein.
-
nutze VB.NET 2003, da gibts keine BackgroundWorker, zu dem hab ich auch schon die events gefunden.... ! muss os wie es aussieht norme Thread verwenden.. aber hab schon hinbekommen, auch ohne events....
-
Du könntest noch ein Doevents in der Schleife machen. Das sorgt zwar dafür das anstehende Events ausgeführt werden, aber der Weg über einen Thread kann sich lohnen. (Manchmal ist ein Doevents einfach näher an der geforderten Lösung drann).
private void button2_Click(object sender, EventArgs e) { MessageBox.Show("Test"); } private void button1_Click(object sender, EventArgs e) { for(int i = 0;i < 50000;++i) { label1.Text = i.ToString(); Application.DoEvents(); } } }
Wenn Sie ein Windows Form ausführen, wird ein neues Formular erstellt, das dann auf zu behandelnde Ereignisse wartet. Immer dann, wenn das Formular ein Ereignis behandelt, wird der gesamte Code verarbeitet, der dem Ereignis zugeordnet ist. Alle anderen Ereignisse verbleiben in der Warteschlange. Während der Code das Ereignis behandelt, reagiert die Anwendung nicht. Beispielsweise wird das Fenster nicht neu aufgebaut, wenn ein anderes Fenster darüber gezogen wird.
Wenn Sie im Code DoEvents aufrufen, kann die Anwendung die anderen Ereignisse behandeln. Wenn Sie beispielsweise bei einem Formular, mit dem einer ListBox Daten hinzugefügt werden, dem Code DoEvents hinzufügen, wird das Formular neu aufgebaut, wenn ein anderes Fenster darüber gezogen wird. Wenn Sie DoEvents aus dem Code entfernen, wird das Formular so lange nicht neu aufgebaut, bis der Click-Ereignishandler der Schaltfläche die Ausführung abgeschlossen hat.
Üblicherweise wird diese Methode in einer Warteschleife verwendet, um Meldungen zu verarbeiten.
Vorsicht
Durch Aufrufen dieser Methode kann Code eventuell erneut durchlaufen werden, wenn eine Meldung ein Ereignis auslöst.