Feedback

VB - Multithreading, Variable für 2 Threads, Lock Beispiel

Veröffentlicht von am 9/14/2008
(1 Bewertungen)
Übersetzung des Snippets von Jimpanse in VB.NET

Hier wird eine Variable von zwei Threads benutzt und mittels lock für den jeweiligen Thread gesperrt, damit die Benutzung der Variable Threadsafe ist.

Der zweite Thread geht eine Liste von Zahlen durch und schreibt diese mit einer Scheife in eine Variable, diese Variable wird vom Mainthread verglichen und ggf. in der Console ausgegeben. Sobald sich current_process ändert, wird diese wieder in der Console ausgegeben.

Ich habe beide cs-dateien in den Code eingefügt, ihr könnt die Dateien jeweils kompilieren, es läuft ohne Änderung einwandfrei.

Hoffe das hilft Jemanden.

Gruß
Jim
==== Program.vb ====

Imports System 
Imports System.Collections.Generic 
Imports System.Windows.Forms 
Imports System.Threading 

Namespace threads_syncen 
    Public Class Program 
        
        <STAThread()> _ 
        Public Shared Sub Main() 
            
            Console.WriteLine("==================Threads==================") 
            
            Dim puffer As Integer = 0 
            Dim demo As New Class1() 
            
            Dim auftrag_bearbeiten As New Thread(New ThreadStart(demo.auftrag)) 
            'auftrag_bearbeiten.Priority = ThreadPriority.AboveNormal;//so kann man auch bewirken das der Thread mehr CPUZeit bekommt und somit ruckzuck der Bool auf True gesetzt wird 
            auftrag_bearbeiten.Start() 
            
            'damit der gerade gestartete Thread auch die Zeit hat den Bool zu ändern 
            Thread.Sleep(10) 
            
            While Class1.auftrag_laeuft = True 
                SyncLock demo 
                    'Object wird gesperrt, damit der Mainthread auf current_process sicher zugreifen kann 
                    If puffer <> Class1.current_process Then 
                        Console.WriteLine(Class1.current_process) 
                        puffer = Class1.current_process 
                    End If 
                End SyncLock 
            End While 
            'damit sich die Console nicht sofort schließt 
            Console.WriteLine("" & Chr(10) & "" + "Taste druecken um zu beenden") 
            Console.ReadKey() 
            
        End Sub 
    End Class 
End Namespace 


==== Class1.vb ====
Imports System 
Imports System.Collections.Generic 
Imports System.Text 
Imports System.Threading 

Namespace threads_syncen 
    
    Public Class Class1 
        'der Aktuelle Auftrag 
        Public Shared current_process As Integer = 0 
        Public Shared auftrag_laeuft As Boolean = False 
        'Zahlen die durchgegangen werden und vom MainThread verglichen werden 
        Private nummern As Integer() = New Integer() {101, 102, 103, 104, 105, 106, _ 
        107, 108, 109, 110, 111, 112, _ 
        113} 
        
        Public Sub auftrag() 
            auftrag_laeuft = True 
            For i As Integer = 0 To nummern.Length - 1 
                
                
                current_process_setzen(nummern(i)) 
                
                'do some Work 
                Thread.Sleep(400) 
            Next 
            auftrag_laeuft = False 
            
        End Sub 
        
        'Methode um current_process zu sperren fuer den Thread 
        Private Sub current_process_setzen(ByVal nummer As Integer) 
            SyncLock Me 
                current_process = nummer 
            End SyncLock 
        End Sub 
        
    End Class 
End Namespace 
Abgelegt unter Multithreading, Threads, Lock, Beispiel.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!