Hallo alle Zame,
ich arbeite gerade an einer Berechnung wo 3D Messpunkte miteinander verglichen werden also immer die X,Y,Z Werte.
Über eine einfache Vektorrechnung wird der Abstand im Raum ermittelt.
Ziel ist es die sich jeweils am nächsten liegenden Punkte zu ermitteln den Abstand abzufragen und dem ersten Punkt diesen Abstand zuzuweisen.
Da wir hier über zwei Punktedateien mit bis zu 16 Millionen Punkten sprechen habe ich das ganze auf mehrere Threads aufgesplittet und lass es
so auf mehreren Prozessoren gleichzeitig rechnen.
Das funktioniert auch gut wenn auch noch nicht ganz so schnell wie ich es gern hätte.
Nun zu meinem Problem.
Ich würde gern eine Progressbar den Berechnungsfortschritt anzeigen lassen. Nur bekomm ich aus den einzelnen laufenden Threads keine auswertbare Information heraus die ich dazu benutzen könnten den Balken zu füllen.
Hat das schon mal einer gemacht? Und könnte Mir einen Tip geben?
Berechnungsroutine des Threads:
Aufruf der Threads aus Hauptprogramm in etwa so:
ich arbeite gerade an einer Berechnung wo 3D Messpunkte miteinander verglichen werden also immer die X,Y,Z Werte.
Über eine einfache Vektorrechnung wird der Abstand im Raum ermittelt.
Ziel ist es die sich jeweils am nächsten liegenden Punkte zu ermitteln den Abstand abzufragen und dem ersten Punkt diesen Abstand zuzuweisen.
Da wir hier über zwei Punktedateien mit bis zu 16 Millionen Punkten sprechen habe ich das ganze auf mehrere Threads aufgesplittet und lass es
so auf mehreren Prozessoren gleichzeitig rechnen.
Das funktioniert auch gut wenn auch noch nicht ganz so schnell wie ich es gern hätte.
Nun zu meinem Problem.
Ich würde gern eine Progressbar den Berechnungsfortschritt anzeigen lassen. Nur bekomm ich aus den einzelnen laufenden Threads keine auswertbare Information heraus die ich dazu benutzen könnten den Balken zu füllen.
Hat das schon mal einer gemacht? Und könnte Mir einen Tip geben?
Berechnungsroutine des Threads:
Visual Basic-Quellcode
- Public Class Rechnung
- Friend PunkteDB1 As List(Of Punkte.Punkt)
- Friend PunkteDB2 As List(Of Punkte.Punkt)
- Friend Ergebnis As List(Of Punkte.Punkt)
- Public Sub Berechnen()
- For Each PP1 As Punkte.Punkt In PunkteDB1
- Dim Abstand As Double
- Dim PP3 As New Punkte.Punkt
- For Each PP2 As Punkte.Punkt In PunkteDB2
- Dim Wert As Double
- Wert = Math.Sqrt((PP2.X - PP1.X) ^ 2 + (PP2.Y - PP1.Y) ^ 2 + (PP2.Z - PP1.Z) ^ 2)
- If Wert < Abstand Then
- Abstand = Wert
- PP3 = PP2
- End If
- PunkteDB2.Remove(PP3)
- Next
- If Abstand < 2 Then
- PP1.Abstand = Abstand
- Ergebnis.Add(PP1)
- End If
- Next
- End Sub
- end class
Aufruf der Threads aus Hauptprogramm in etwa so:
Visual Basic-Quellcode
- Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
- Dim Rechner1 As New Rechnung
- Dim Rechner2 As New Rechnung
- Dim Rechner3 As New Rechnung
- Dim Rechner4 As New Rechnung
- Dim Einfügen1 As New System.Threading.Thread(AddressOf Rechner1.Berechnen1)
- Dim Einfügen2 As New System.Threading.Thread(AddressOf Rechner2.Berechnen2)
- Dim Einfügen3 As New System.Threading.Thread(AddressOf Rechner3.Berechnen3)
- Dim Einfügen4 As New System.Threading.Thread(AddressOf Rechner4.Berechnen4)
- Dim Bereich1 As New List(Of Punkte.Punkt)
- Dim Bereich2 As New List(Of Punkte.Punkt)
- Dim Bereich3 As New List(Of Punkte.Punkt)
- Dim Bereich4 As New List(Of Punkte.Punkt)
- Rechner1.PunkteDB1 = Bereich1
- Rechner2.PunkteDB1 = Bereich2
- Rechner3.PunkteDB1 = Bereich3
- Rechner4.PunkteDB1 = Bereich4
- Rechner1.PunkteDB2 = PunkteDef2.PunkteDB
- Rechner2.PunkteDB2 = PunkteDef2.PunkteDB
- Rechner3.PunkteDB2 = PunkteDef2.PunkteDB
- Rechner4.PunkteDB2 = PunkteDef2.PunkteDB
- Einfügen1.Start()
- Einfügen2.Start()
- Einfügen3.Start()
- Einfügen4.Start()
- Einfügen1.Join()
- For Each PP As Punkte.Punkt In Rechner1.Ergebnis
- Ergebnis.Add(PP)
- Next
- Einfügen2.Join()
- For Each PP As Punkte.Punkt In Rechner2.Ergebnis
- Ergebnis.Add(PP)
- Next
- Einfügen3.Join()
- For Each PP As Punkte.Punkt In Rechner3.Ergebnis
- Ergebnis.Add(PP)
- Next
- Einfügen4.Join()
- For Each PP As Punkte.Punkt In Rechner4.Ergebnis
- Ergebnis.Add(PP)
- Next
- End Sub