Omlouvám se, za poslední dotaz. Použití SYNCLOCK je jednoduché. Podle toho příkladu co jste mi poslal to funguje skvěle, moc děkuji. Objevil se, ale ještě jeden problém. Po několika hodinách provozu, aplikace zkolabuje a vypíše tuto chybu: Application: Vazeni K1.exe Framework Version: v4.0.30319 Description: The process was terminated due to an unhandled exception. Exception Info: System.OutOfMemoryException Stack: at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) at System.Threading._TimerCallback.PerformTimerCallback(System.Object) Tady je základní část kódu tříky, kde vzniká tato chyba. Chyba se generuje v proceduře DoDisplay(), ale nevím proč. Procedura jen přiřadí obrázek do PictureBoxu. Nevidí v tom kódu někdo chybu?
Imports System
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.IO.Ports
Imports System.Windows.Forms
Public Class Scale
#Region "Definice promennych"
'Seriovy port
Private _comPort As New SerialPort()
Private WithEvents _displayWindow As PictureBox
Private _picBck As Bitmap
Private g As Graphics
'Delegat prirazeni grafiky
Delegate Sub DoDisplayDelegate()
#End Region
#Region "Nastaveni a cteni promennych"
'Nastaveni displeje vahy
Public Property Display() As PictureBox
Get
Return _displayWindow
End Get
Set(ByVal value As PictureBox)
_displayWindow = value
'Vytvoreni grafiky
_picBck = New Bitmap(_displayWindow.Width, _displayWindow.Height)
g = Graphics.FromImage(_picBck)
'Nastaveni kvality grafiky
g.SmoothingMode = SmoothingMode.AntiAlias
g.InterpolationMode = InterpolationMode.HighQualityBicubic
g.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit
'Vykresleni dpsleje
DisplayData()
End Set
End Property
#End Region
#Region "Prijata data ze serioveho portu"
Private Sub comPort_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
Try
'Nacteni radku z bufferu serioveho portu
_readData = _comPort.ReadLine
'***************************************************************************************
'Kod pro zpracovani prijateho retezce
'***************************************************************************************
'Akturalizace displeje
DisplayData()
Catch ex As Exception
'Chyba cteni serioveho portu
_comPortErrorRead = True
'Akturalizace displeje
DisplayData()
End Try
End Sub
'Kontrolni casovac komunikace s vahou
Private Sub _comPortTimer_Elapsed(sender As Object, e As Timers.ElapsedEventArgs) Handles _comPortTimer.Elapsed
'Kontrola zda se neceka na prvni telegram
If _comPortWait = False Then
'Citac preruseni komunikace
_comPortCout += 1
'3s neprisel zadny telegram z vahy
If _comPortCout >= 30 And _comPortNotCom = False Then
'Chyba komunikace
_comPortNotCom = True
'Reset portu
ResetPort()
'Vaha neni pripravena
_ready = False
RaiseEvent ScaleReady(False)
'Update displeji
DisplayData()
End If
End If
End Sub
#End Region
#Region "DisplayData"
Private Sub DisplayData()
'Zamceni procedury
SyncLock GetType(Scale)
'Kontrola zda je prirazen displej
If Not IsNothing(_displayWindow) Then
'Vymazani grafiky
g.Clear(Color.Transparent)
'***************************************************************************************
'Kod pro vytvoreni grafiky
'***************************************************************************************
'Update displeje
DoDisplay()
End If
'Ukonceni zamku
End SyncLock
End Sub
#End Region
#Region "Vykresleni displeje vahy"
Protected Sub DoDisplay()
If _displayWindow.InvokeRequired Then
'jsme v jiném vlákně
_displayWindow.Invoke(New DoDisplayDelegate(AddressOf DoDisplay))
Exit Sub
End If
_displayWindow.Image = _picBck
End Sub
#End Region
End Class
|