Dobrý den, Na mob. zařízení s CE6.5 bych potřeboval sledovat velikost obsazení paměti. Napsal jsem si tuto třídu, ve které je vlastní vlákno vykonávající nekonečnou smyčku a v každém průchodu se zjistí procentuální vytížení paměti. Pokud se bude číslo lišit od předchozího výsledku zavolá se událost MemoryUsageChanged s parametrem v as int32. V hlavním vlákně na formu se mi vyvolá tato událost, avšak nevím jak z ní správně přistupovat k prvku na formu. Nyní mám funkční řešení ale nevím zdali je správně. Vlákno se spouští procedurou Start() z formLoad události. Formulář s prvkem
Private WithEvents ramLoader As New clsMemoryUsage
Private Delegate Sub SetProgressBar()
Private value As Int32
Private Sub ramLoader_MemoryLoadChanged(ByVal sender As Object, ByVal v As Integer) Handles ramLoader.MemoryLoadChanged
If Me.ProgressBar1.InvokeRequired Then
Me.value = v
Me.ProgressBar1.BeginInvoke(New SetProgressBar(AddressOf Me.ZmenaProgressBaru))
Else
Me.value = v
Me.ZmenaProgressBaru()
End If
End Sub
Private Sub ZmenaProgressBaru()
Me.ProgressBar1.Value = Me.value
End Sub
Třída s druhým vláknem.
Public Class clsMemoryUsage
Private _lastLoad As Int32
Private _start As Boolean
Public Delegate Sub MemoryChangedDelegate(ByVal sebder As Object, ByVal e As Int32)
Public Event MemoryUsageChanged As MemoryChangedDelegate
Private _isStarted As Boolean = False
Private _th As New Thread(AddressOf Me.NonEndCycle)
''' <summary>
''' Cyklus pro druhé vlákno
''' </summary>
''' <remarks></remarks>
Private Sub NonEndCycle()
While True
Me.Load = Me.GetUsageMemory
Thread.Sleep(5000)
End While
End Sub
''' <summary>
''' Procentuální vytížení paměti
''' </summary>
Public Property Load() As Int32
Get
Return Me._lastLoad
End Get
Set(ByVal value As Int32)
If value <> Me._lastLoad AndAlso value >= 0 AndAlso value <= 100 Then
Me._lastLoad = value
RaiseEvent MemoryUsageChanged(Me, value)
End If
End Set
End Property
''' <summary>
''' Spuštění druhého vlákna
''' </summary>
''' <remarks></remarks>
Public Sub Start()
If Me._isStarted Then Exit Sub
Me._th.Start()
Me._isStarted = True
End Sub
''' <summary>
''' Pinvoke funkce pro status paměti
''' </summary>
<DllImport("coredll.dll")> _
Private Shared Function GlobalMemoryStatus(ByRef ms As MEMORYSTATUS) As Int32
End Function
''' <summary>
''' Struktura pro pinvoke funkci
''' </summary>
''' <remarks></remarks>
Public Structure MEMORYSTATUS
...
End Structure
''' <summary>
''' Vrátí procentuální vytížení paměti
''' </summary>
Public Function GetUsageMemory() As Int32
Dim ms As New MEMORYSTATUS
ms.dwLenght = Marshal.SizeOf(ms)
GlobalMemoryStatus(ms)
Return ms.dwMemoryLoad
End Function
End Class
|