Archief - [PROG][VB.NET] Threads Cross-method call duurt heel lang

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

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:
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
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan