dieterm
Legacy Member
Hallo allemaal,
Ik heb een probleem bij het oproepen van de sub Renderer.setMaximum(...)(die zich in een UserControl bevindt) vanuit een andere thread. Ik gebruik hiervoor een delegate, en op het moment dat ik de parent_renderer.Invoke(...) oproep gebeurt er een 10tal seconden niets, en daarna gaat hij gewoon verder.
Als ik in mijn Immediate-venster kijk blijft hij dus hangen op het moment nadat hij deze regel heeft afgedrukt:
Ik heb een HttpServer classe gemaakt die in de New(..) constructor een nieuwe thread start:
De Renderer-classe ziet er als volgt uit:
Ik heb een probleem bij het oproepen van de sub Renderer.setMaximum(...)(die zich in een UserControl bevindt) vanuit een andere thread. Ik gebruik hiervoor een delegate, en op het moment dat ik de parent_renderer.Invoke(...) oproep gebeurt er een 10tal seconden niets, en daarna gaat hij gewoon verder.
Als ik in mijn Immediate-venster kijk blijft hij dus hangen op het moment nadat hij deze regel heeft afgedrukt:
HttpServer_invoke_setMaximumDelegate_start
Ik heb een HttpServer classe gemaakt die in de New(..) constructor een nieuwe thread start:
Code:
Public Class HttpServer
Private parent_renderer As Renderer = Nothing
Private tcp_listener As TcpListener
Private file_stream As FileStream = Nothing
Public Sub New(ByVal root_path As String, ByVal port As Integer)
Try
tcp_listener = New TcpListener(_port)
tcp_listener.Start()
Debug.WriteLine("Webserver Running...")
th = New Thread(AddressOf StartListen)
th.IsBackground = True 'Automatisch stoppen als applicatie afsluit
th.Start()
Catch ex As Exception
Debug.WriteLine(ex.ToString)
End Try
End Sub
Public Delegate Sub setMaximumDelegate(ByVal newPosition As Integer)
Public Delegate Sub setPositionDelegate(ByVal newPosition As Integer)
Public Sub StartListen()
Dim sPhysicalFilepath As String
While True
Dim mySocket As Socket = _listener.AcceptSocket()
If mySocket.Connected Then
'... hier wordt vanalles gedaan om binnenkomende request te analiseren..
'... het pad van het gevraagde bestand wordt in sPhysicalFilepath opgeslagen,
' dus daar staat zoiets als 'c:\test\mysong.mp3' in
'het gevraagde bestand wordt klaargemaakt om doorgestuurd te worden...
file_stream = New FileStream(sPhysicalFilepath, FileMode.Open, FileAccess.Read, FileShare.Read)
'Roep de Sub parent_renderer.setMaximum(...) op om de maximumwaarde van de trackbar in te stellen
If Not parent_renderer Is Nothing Then
Dim args() As Object = {CInt(fs.Length)}
Dim myDelegate As New setMaximumDelegate(AddressOf parent_renderer.setMaximum)
Debug.WriteLine("HttpServer_invoke_setMaximumDelegate_start")
[COLOR="Red"][B]'HIER ZIT HET PROBLEEM: Bij het uitvoeren van de volgende regel stopt het programma voor een 10tal seconden[/B][/COLOR]
parent_renderer.Invoke(myDelegate, args)
Debug.WriteLine("HttpServer_invoke_setMaximumDelegate_finish")
End If
'Stuur de HTTP header naar de http-client
SendHeader(sHttpVersion, "", iTotBytes * 1000, " 200 OK", mySocket)
Dim reader As New BinaryReader(fs)
Dim bytes(10000) As Byte 'de bestands-buffer waarin telkens een deel van het gevraagde bestand wordt ingelezen
Dim read As Integer 'hierin komt het effectief aantal gelezen bytes
Do
read = reader.Read(bytes, 0, bytes.Length)
If read <> 0 Then
SendToBrowser(bytes, mySocket, read)
End If
'update de positie van de Trackbar
If Not Me._parent_renderer Is Nothing Then
Dim args() As Object = {CInt(fs.Position)}
Dim myDelegate As New setPositionDelegate(AddressOf Me._parent_renderer.setPosition)
parent_renderer.Invoke(myDelegate, args)
End If
Loop While read <> 0 And mySocket.Connected = True
End If
mySocket.Close()
End While
End Sub
End Class
De Renderer-classe ziet er als volgt uit:
Code:
' De Renderer UserControl bevat een TrackBar (zo'n ding dat de positie aanduidt en dat je met de muis kunt verslepen om een waarde tussen een Minimum en Maximum te kiezen)
Public Class Renderer
Inherits UserControl
Dim track_bar as Windows.Forms.TrackBar 'wordt geinstantieerd in de subInitializeComponents routine
Dim myHttpServer As HttpServer = Nothing
Public Sub New()
Me.myHttpServer = new HttpServer()
End Sub
Public Sub setPosition(ByVal newPosition As Integer)
Me.track_bar.Value = newPosition
End Sub
Public Sub setMaximum(ByVal maxValue As Integer)
Me.track_bar.Maximum = maxValue
End Sub
End Class