RTF Box - Speicherproblem

01/12/2008 - 21:59 von Thomas Hübner | Report spam
Hi NG,

Ich bin schon ewig auf der Suche nach einem Memleak in meiner
Applikation und habe es glaube ich jetzt eingekreist. Wenn ich im code
unten logIsON = False setze stagniert (bzw. erhöt sich nur minimal) der
Speicherverbrauch obwohl die Queue kontinurierlich weiter gefüllt wird
bis Setup.maxLogLength (ab da wird "ins Leere" dequeued).

Eine RTF Box wird aus einer Queue mit Zeilen versorgt. Beim zufügen wird
eine 10 stufige IF THEN Kaskade durchlaufen in der vom User vergebene
Formatierungen vergeben werden (Einfache Regex.IsMatch Methode). Beim
Eintritt in die Sub prüfe ich noch ob die Box schon die vom User
angegebene maximale Zeilenanzahl erreicht hat und lösche ggf. oben
Zeilen weg. Scheinbar wird bei diesm löschen aber kein Speicher
freigegeben sondern auf die Dauer macht sich die Anwendung ordentlich
breit. Wie gesagt ich habe den Verdacht - das muß nicht der Grund sein.
Der code sieht so aus (mit Wrapper da Threadübergreifend gearbeitet wird):

#Region "Refresh GUI -> Log"
Public Sub Call_LogRefresh()
If Not Me.WindowState = FormWindowState.Minimized And _
Not Me.Visible = False Then

Me.Invoke(WrapperLogRefresh)
End If
End Sub

Private Delegate Sub _WrapperLogRefresh()
Private WrapperLogRefresh As New _WrapperLogRefresh(AddressOf
Do_LogRefresh)

Private Sub Do_LogRefresh()
Try
Do While completeLogBuffer.Count > Setup.maxLogLength
SyncLock completeLogBuffer
completeLogBuffer.Dequeue()
End SyncLock
Loop
If logIsON Then
If completeLogBuffer.Count >= Setup.maxLogLength Then
tbo_log.Text = ""
Do While completeLogBuffer.Count > 0
SyncLock completeLogBuffer
log(completeLogBuffer.Dequeue, tbo_log)
End SyncLock
Loop
End If
Catch ex As Exception
debug("Do_LogRefresh: " & ex.Message)
End Try
End Sub

#End Region


Public Sub log(ByRef text As String, ByRef box As RichTextBox)

'Cleanup > Maxlines
If box.Lines.Length >= Setup.maxLogLength Then
Do While box.Lines.Length >= Setup.maxLogLength
Dim linelen As Integer = box.Lines(0).Length + 1
box.Select(0, linelen)
box.SelectedRtf = ""
Loop
End If

Try
Dim r As Regex
With box

Dim forecolor As Color = Color.Black
Dim backcolor As Color = Color.White
Dim visible As Boolean = True

If Not Setup.field0Text = "" Then
r = New Regex(Setup.field0Text)
If r.IsMatch(text) Then
visible = Setup.field0visible
forecolor = Setup.field0colorFG
backcolor = Setup.field0colorBG
End If
End If

If Not Setup.field1Text = "" Then
r = New Regex(Setup.field1Text)
If r.IsMatch(text) Then
visible = Setup.field1visible
forecolor = Setup.field1colorFG
backcolor = Setup.field1colorBG
End If
End If

If Not Setup.field2Text = "" Then
r = New Regex(Setup.field2Text)
If r.IsMatch(text) Then
visible = Setup.field2visible
forecolor = Setup.field2colorFG
backcolor = Setup.field2colorBG
End If
End If

If Not Setup.field3Text = "" Then
r = New Regex(Setup.field3Text)
If r.IsMatch(text) Then
visible = Setup.field3visible
forecolor = Setup.field3colorFG
backcolor = Setup.field3colorBG
End If
End If

If Not Setup.field4Text = "" Then
r = New Regex(Setup.field4Text)
If r.IsMatch(text) Then
visible = Setup.field4visible
forecolor = Setup.field4colorFG
backcolor = Setup.field4colorBG
End If
End If

If Not Setup.field5Text = "" Then
r = New Regex(Setup.field5Text)
If r.IsMatch(text) Then
visible = Setup.field5visible
forecolor = Setup.field5colorFG
backcolor = Setup.field5colorBG
End If
End If

If Not Setup.field6Text = "" Then
r = New Regex(Setup.field6Text)
If r.IsMatch(text) Then
visible = Setup.field6visible
forecolor = Setup.field6colorFG
backcolor = Setup.field6colorBG
End If
End If

If Not Setup.field7Text = "" Then
r = New Regex(Setup.field7Text)
If r.IsMatch(text) Then
visible = Setup.field7visible
forecolor = Setup.field7colorFG
backcolor = Setup.field7colorBG
End If
End If

If Not Setup.field8Text = "" Then
r = New Regex(Setup.field8Text)
If r.IsMatch(text) Then
visible = Setup.field8visible
forecolor = Setup.field8colorFG
backcolor = Setup.field8colorBG
End If
End If

If Not Setup.field9Text = "" Then
r = New Regex(Setup.field9Text)
If r.IsMatch(text) Then
visible = Setup.field9visible
forecolor = Setup.field9colorFG
backcolor = Setup.field9colorBG
End If
End If

If visible Then
Dim start As Integer = .TextLength
.AppendText(text)
.Select(start, .TextLength - start)
.SelectionColor = forecolor
.SelectionBackColor = backcolor
.Select(.TextLength, 0)
End If


r = Nothing
forecolor = Nothing
backcolor = Nothing
visible = Nothing

.ScrollToCaret()
End With 'tbo_log
Catch ex As Exception
debug2("log" & ex.Message & " - " & ex.Source)
End Try
End Sub
 

Lesen sie die antworten

#1 Thomas Hübner
01/12/2008 - 22:18 | Warnen spam
selbst wenn ich die Box manuell leere (Alles markieren + Delete)
wird kein Speicher freigegeben. Wàre "ab und zu" eine neue Instanz der
RTF Box, Inhalt umkopieren und dispose der Alten eine Lösung?

Gruß,
Thomas

Ähnliche fragen