Hallo zusammen,
Ich habe ein Problem mit Multithreading und Klassen und daher eine kleines Testtool gebaut.
Es werden 5 Threads durch klick auf einen Button erzeugt und übergebe da die Zahl (1 bis 5) zur Zuordnung.
Beim Start jedes Threads wird eine Testklasse Instanziert und die Werte in die Properties geschrieben.
Die klasse macht einfach nur eine Addition von Zahlen.
Jeder Thread schreibt seine werte in (eigentlich) seine eigene .csv-Datei (siehe auch Dateianhang).
Wenn ich diese mir anschaue, haben die einzelnen CSV-Dateien die Werte der Anderen Threads, obwohl diese nicht miteinander kommunizieren.
Wie bekomme ich es hin, dass die Threads die Werte in der Klasse nicht an die anderen Threads weitergibt.
oder wo liegt hier mein Denkfehler?
Form1.vb
Spoiler anzeigen
Class1.vb
Spoiler anzeigen
*Thema verschoben das es nichts mit WPF zu tun hat. Bitte das nächste mal darauf achten. Danke. ~NoFear23m
Ich habe ein Problem mit Multithreading und Klassen und daher eine kleines Testtool gebaut.
Es werden 5 Threads durch klick auf einen Button erzeugt und übergebe da die Zahl (1 bis 5) zur Zuordnung.
Beim Start jedes Threads wird eine Testklasse Instanziert und die Werte in die Properties geschrieben.
Die klasse macht einfach nur eine Addition von Zahlen.
Jeder Thread schreibt seine werte in (eigentlich) seine eigene .csv-Datei (siehe auch Dateianhang).
Wenn ich diese mir anschaue, haben die einzelnen CSV-Dateien die Werte der Anderen Threads, obwohl diese nicht miteinander kommunizieren.
Wie bekomme ich es hin, dass die Threads die Werte in der Klasse nicht an die anderen Threads weitergibt.
oder wo liegt hier mein Denkfehler?
Form1.vb
VB.NET-Quellcode
- Public Class Form1
- Public w_(10) As Threading.Thread
- Public dt_(10) As DataTable
- Dim a(10) As Class1
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- Dim test As New Threading.Thread(AddressOf Test_Thread)
- test.SetApartmentState(Threading.ApartmentState.STA)
- test.IsBackground = True
- test.Start()
- End Sub
- Sub Test_Thread()
- For i As Integer = 1 To 2
- w_(i) = New Threading.Thread(AddressOf Test_Thread2)
- w_(i).SetApartmentState(Threading.ApartmentState.STA)
- w_(i).IsBackground = True
- w_(i).Start(i)
- Next
- End Sub
- Sub Test_Thread2(worker As Integer)
- Dim header As String = "id1;id2;id3;id4" & vbCrLf
- My.Computer.FileSystem.WriteAllText(My.Application.Info.DirectoryPath & "\" & worker & ".write.csv", header, False)
- Dim b As New Class1
- Dim i_max As Integer = 100
- For i As Integer = 0 To i_max
- Select Case worker
- Case 1
- Me.Invoke(Sub() ProgressBar1.Minimum = 0)
- Me.Invoke(Sub() ProgressBar1.Maximum = i_max)
- Me.Invoke(Sub() ProgressBar1.Value = i)
- b.work_id2 = 1
- Case 2
- Me.Invoke(Sub() ProgressBar2.Minimum = 0)
- Me.Invoke(Sub() ProgressBar2.Maximum = i_max)
- Me.Invoke(Sub() ProgressBar2.Value = i)
- b.work_id2 = 2
- Case 3
- Me.Invoke(Sub() ProgressBar3.Minimum = 0)
- Me.Invoke(Sub() ProgressBar3.Maximum = i_max)
- Me.Invoke(Sub() ProgressBar3.Value = i)
- b.work_id2 = 3
- Case 4
- Me.Invoke(Sub() ProgressBar4.Minimum = 0)
- Me.Invoke(Sub() ProgressBar4.Maximum = i_max)
- Me.Invoke(Sub() ProgressBar4.Value = i)
- b.work_id2 = 4
- Case 5
- Me.Invoke(Sub() ProgressBar5.Minimum = 0)
- Me.Invoke(Sub() ProgressBar5.Maximum = i_max)
- Me.Invoke(Sub() ProgressBar5.Value = i)
- b.work_id2 = 5
- End Select
- b.work_id1 = i
- Threading.Thread.Sleep(10)
- b.summa()
- 'a(worker).summa2()
- Dim c As New Class1
- c.work_id1 = b.work_id1
- c.work_id2 = b.work_id2
- c.work_id3 = b.work_id3
- c.work_id4 = b.work_id4
- c.summa2()
- Dim txt As String = c.work_id1 & ";" & c.work_id2 & ";" & c.work_id3 & ";" & c.work_id4 & vbCrLf
- My.Computer.FileSystem.WriteAllText(My.Application.Info.DirectoryPath & "\" & worker & ".write.csv", txt, True)
- dt_(worker).BeginLoadData()
- dt_(worker).Rows.Add(New Object() {b.work_id3})
- dt_(worker).EndLoadData()
- dt_(worker).AcceptChanges()
- Next
- End Sub
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- For i As Integer = 1 To 5
- dt_(i) = New DataTable
- dt_(i).TableName = "test"
- dt_(i).Columns.Add("id")
- a(i) = New Class1
- Select Case i
- Case 1
- ComboBox1.ValueMember = "id"
- ComboBox1.DisplayMember = "id"
- ComboBox1.DataSource = dt_(i)
- Case 2
- ComboBox2.ValueMember = "id"
- ComboBox2.DisplayMember = "id"
- ComboBox2.DataSource = dt_(i)
- Case 3
- ComboBox3.ValueMember = "id"
- ComboBox3.DisplayMember = "id"
- ComboBox3.DataSource = dt_(i)
- Case 4
- ComboBox4.ValueMember = "id"
- ComboBox4.DisplayMember = "id"
- ComboBox4.DataSource = dt_(i)
- Case 5
- ComboBox5.ValueMember = "id"
- ComboBox5.DisplayMember = "id"
- ComboBox5.DataSource = dt_(i)
- End Select
- Next
- End Sub
- End Class
Class1.vb
VB.NET-Quellcode
- Public Class Class1
- Private Shared id1 As Integer
- Private Shared id2 As Integer
- Private Shared id3 As Integer
- Private Shared id4 As Integer
- Public Property work_id1() As Integer
- Get
- Return id1
- End Get
- Set(value As Integer)
- id1 = value
- End Set
- End Property
- Public Property work_id2() As Integer
- Get
- Return id2
- End Get
- Set(value As Integer)
- id2 = value
- End Set
- End Property
- Public Property work_id3() As Integer
- Get
- Return id3
- End Get
- Set(value As Integer)
- id3 = value
- End Set
- End Property
- Public Property work_id4() As Integer
- Get
- Return id4
- End Get
- Set(value As Integer)
- id4 = value
- End Set
- End Property
- Public Sub New()
- End Sub
- Sub summa()
- id3 = id1 + id2
- 'summa2()
- End Sub
- Sub summa2()
- id4 = id3 + id2
- End Sub
- End Class
*Thema verschoben das es nichts mit WPF zu tun hat. Bitte das nächste mal darauf achten. Danke. ~NoFear23m
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nofear23m“ ()