| 

.NET C# Java Javascript Exception

1
Hallo,
mein Code ist zu langsam - insgesamt müssen 10 * 24 = 240 verschieden farbige Labels gelöscht werden, die zur Laufzeit angelegt wurden - das dauert mir aber in der Entwicklungsumgebung und auch im Echtbetrieb ca 3-5 Sekunden (zu lang), da es immer wieder zu wiederholen ist.
Hat jemand eine Idee zur Beschleunigung? Freue mich über jede Antwort.

Sub AlleVariablenLabelslöschen()
'löscht Labels für Kennzeichen und Belegung, die dynamisch zur Laufzeit angelegt wurden:
For i As Integer = dlg_main.Controls.Count - 1 To 0 Step -1
If LCase(Left(dlg_main.Controls(i).Name, 3)) = "var" Then
dlg_main.Controls(i).Dispose()
End If
Next
End Sub


'VB.NET 2012, Framework 4.0
Mischa Richter
10.07.2014
Das wird die Ausführung zwar nicht wie erhofft steigern, aber vielleicht ein wenig schneller machen. Schreib mal vor der Schleife ein dlg_main.SuspendLayout() und nach der Schleife ein dlg_main.ResumeLayout(). Damit verhinderst Du das Neupinseln. Übermäßig viel Zeit wirst Du damit aber auch nicht sparen.
muffi 11.07.2014
2 Antworten
0
Ich habe versucht, dein Problem nachzustellen. Dazu habe ich ein kleines Programm gechrieben, welches 250 Labels auf einem Formular plaziert und diese wieder löscht, so wie du es machst. Auf meinem Rechner dauert das ganze einen Wimperschlag (d.h. deutlich unter einer Sekunde). Ich gehe mal davon aus, dass du in deinem Formular noch eine ganze Menge weitere Controls plaziert hast.

Des Weiteren wundert mich, dass du die Dispose()-Methode des Controls aufrufst. Normalerweise entfernt man doch einen Eintrag aus einer Liste mit Remove() bzw. in deinem Fall mit RemoveAt(i) und überlässt den Rest dem Garbage Collector. Dies führt mich dazu, dass dies auch ein Grund für die lange Laufzeit sein könnte. Durch das Dispose() wird das Control explizit freigegeben und dadurch möglicherweise der Garbage-Collector aktiviert.

Eine Möglichkeit, die Anzahl der Schleifendurchläufe zu reduzieren wäre, die dynamischen Controls zusätzlich in einer eigenen Auflistung zu speichern (es sind ja nur Referenzen). Dann könntest du mit einem einfachen

...
Dim dynamicControl as New Control()
...
dlg_main.Controls.Add(dynamicControl)
MyDynamicControls.Add(dynamicControl)
...
For Each ctrl in MyDynamicControls
dlg_main.Controls.Remove(ctrl)
Next

löschen.
11.07.2014
luedi 2,2k 1 9
0
Hallo, danke für die Tips.
Ich habe eine sichtbare Beschleunigung hinbekommen mit
...
RemoveHandler dlg_main.Controls(i).MouseMove, AddressOf ArrLabel3_MouseMove
RemoveHandler dlg_main.Controls(i).MouseClick, AddressOf ArrLabel3_mouseClick
...

und mit

dlg_main.SuspendLayout() 'vor der Schleife
dlg_main.ResumeLayout() 'nach der schleife.

Übrigens:
die Labels werden als Array deklariert:
Dim ArrLabels3(AnzPKW, 23) As System.Windows.Forms.Label
da geht New nicht und somit auch kein Remove.

Ich bastel weiter ....
14.07.2014

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH