Hallo Ihr lieben,
ich bin mir nicht sicher ob das direkt in das WPF-Forum gehört, da ich schon immer meine Probleme mit Multithreading hatte, aber da dies mein erster Versuch in WPF ist, hab ich das mal hier aufgemacht, wenn das falsch sein sollte bitte verschieben.
Ich bin mal über diesen Topic gestoßen Infinite-Monkey-Theorem Tool Programmieren? - Sonstige Problemstellungen - VB-Paradise 2.0 — Die große Visual–Basic– und .NET–Community (vb-paradise.de) und dachte das wäre doch mal ein gutes kleines Übungsprojekt.
Im Vorfeld dachte ich zumindest, dass wenn ich das über Propertys regeln würde, ich in der WPF auch ohne Multithreading, einfach im ablauf eines Loops, die Ergebnisse in der UI angezeigt bekomme, wie sich nun zeigt, friert während eines Loops auch die WPF ein. Also komme ich wohl nicht um Threading herum.....
Jedoch muss ich zugeben das es mir gänzlich am Verständniss des Threadings mangelt, man findet viele verschiedene Ansätze, direkt über Thread, über eigene Prozesse, Backgroundworker usw. aber bislang scheitere ich massiv an deren Anwendung.
bisheriger Ansatz (definitiv nicht funktionsfähig da ja noch ohne Threading)
Spoiler anzeigen
Ich müsste also einen Weg finden um:
Diese Sub in nach Möglichkeit so vielen Threads auszuführen wie Kerne da Sind, aber ich komme nichtmal auf einen guten Ansatz wie ich das versuchen könnte, evtl. kann mir von euch ja jemand ein kleines Beispiel posten, wie Ihr in so einem Fall auf Threading zurückgreift ? Was soll cih wählen, Backgroundworker oder Threads direkt ? Und ich stoße hierbei auch immer wieder auf so genanntes Invoken, was sich mir auch noch nicht erschließt. Bitte nicht falsch verstehen, ich möchte keinen vorgekauten Code, aber ein gutes Beispiel und ein paar Ansätze wären echt eine große Hilfe
Vielen dank schonmal =)
Nachtrag: Ich habs zumindest schonmal soweit hinbekommen, das ich einen Thread zum laufen bekomme,
Spoiler anzeigen
allerdings friert das Programm ein, wenn ich auf diese Weise versuche, mehrere Threads davon zu starten, aber es muss doch irgendwie möglich sein, meinen Prozessor damit auch wirklich auf Anschlag auszulasten, also mehrere Threads zeitgleich an so einer Aufgabe arbeiten zu lassen, oder nicht ?
ich bin mir nicht sicher ob das direkt in das WPF-Forum gehört, da ich schon immer meine Probleme mit Multithreading hatte, aber da dies mein erster Versuch in WPF ist, hab ich das mal hier aufgemacht, wenn das falsch sein sollte bitte verschieben.
Ich bin mal über diesen Topic gestoßen Infinite-Monkey-Theorem Tool Programmieren? - Sonstige Problemstellungen - VB-Paradise 2.0 — Die große Visual–Basic– und .NET–Community (vb-paradise.de) und dachte das wäre doch mal ein gutes kleines Übungsprojekt.
Im Vorfeld dachte ich zumindest, dass wenn ich das über Propertys regeln würde, ich in der WPF auch ohne Multithreading, einfach im ablauf eines Loops, die Ergebnisse in der UI angezeigt bekomme, wie sich nun zeigt, friert während eines Loops auch die WPF ein. Also komme ich wohl nicht um Threading herum.....
Jedoch muss ich zugeben das es mir gänzlich am Verständniss des Threadings mangelt, man findet viele verschiedene Ansätze, direkt über Thread, über eigene Prozesse, Backgroundworker usw. aber bislang scheitere ich massiv an deren Anwendung.
bisheriger Ansatz (definitiv nicht funktionsfähig da ja noch ohne Threading)
VB.NET-Quellcode
- Imports System.Collections.ObjectModel
- Imports System.Timers
- Imports System
- Imports System.ComponentModel
- Imports System.Windows
- Public Class MainViewModel
- Inherits BaseViewModel
- Public Shared ReadOnly Instance As New MainViewModel
- Dim rnd As New Random
- Dim rndWord As New Text.StringBuilder
- Dim Runtimer As New Stopwatch
- Private _targetWord As String = String.Empty
- Public Property TargetWord() As String
- Get
- Return _targetWord
- End Get
- Set(ByVal value As String)
- ChangePropIfDifferent(value, _targetWord)
- End Set
- End Property
- Private _runtime As TimeSpan = TimeSpan.Zero
- Public Property Runtime() As TimeSpan
- Get
- Return _runtime
- End Get
- Set(ByVal value As TimeSpan)
- ChangePropIfDifferent(value, _runtime)
- End Set
- End Property
- Private _results As ObservableCollection(Of String) = New ObservableCollection(Of String)
- Public Property Results() As ObservableCollection(Of String)
- Get
- Return _results
- End Get
- Set(ByVal value As ObservableCollection(Of String))
- ChangePropIfDifferent(value, _results)
- End Set
- End Property
- Public ReadOnly Property StartMonkeysCommand As New RelayCommand(AddressOf StartMonkeysCommand_Execute, Function(o) TargetWord IsNot String.Empty)
- Private Sub StartMonkeysCommand_Execute(obj As Object)
- MonkeysAtWork()
- End Sub
- Private Sub MonkeysAtWork()
- Runtimer.Reset()
- Do Until Results.Contains(TargetWord)
- For i As Integer = 0 To TargetWord.Length - 1
- rndWord.Append(Chr(rnd.Next(65, 90)))
- Next
- Results.Add(rndWord.ToString)
- Runtime = Runtimer.Elapsed
- rndWord.Clear()
- Loop
- End Sub
- End Class
Ich müsste also einen Weg finden um:
Diese Sub in nach Möglichkeit so vielen Threads auszuführen wie Kerne da Sind, aber ich komme nichtmal auf einen guten Ansatz wie ich das versuchen könnte, evtl. kann mir von euch ja jemand ein kleines Beispiel posten, wie Ihr in so einem Fall auf Threading zurückgreift ? Was soll cih wählen, Backgroundworker oder Threads direkt ? Und ich stoße hierbei auch immer wieder auf so genanntes Invoken, was sich mir auch noch nicht erschließt. Bitte nicht falsch verstehen, ich möchte keinen vorgekauten Code, aber ein gutes Beispiel und ein paar Ansätze wären echt eine große Hilfe
Vielen dank schonmal =)
Nachtrag: Ich habs zumindest schonmal soweit hinbekommen, das ich einen Thread zum laufen bekomme,
VB.NET-Quellcode
- Imports System.Collections.ObjectModel
- Imports System.Timers
- Imports System
- Imports System.ComponentModel
- Imports System.Windows
- Public Class MainViewModel
- Inherits BaseViewModel
- Public Shared ReadOnly Instance As New MainViewModel
- Dim Runtimer As New Stopwatch
- #Region "ThreadSafeStuff"
- Delegate Sub Update_UI(ByVal FoundString As String)
- Public Sub Update_UISub(ByVal FoundString As String)
- Results.Add(FoundString)
- Runtime = Runtimer.Elapsed
- End Sub
- #End Region
- Private _targetWord As String = String.Empty
- Public Property TargetWord() As String
- Get
- Return _targetWord
- End Get
- Set(ByVal value As String)
- ChangePropIfDifferent(value, _targetWord)
- End Set
- End Property
- Private _runtime As TimeSpan = TimeSpan.Zero
- Public Property Runtime() As TimeSpan
- Get
- Return _runtime
- End Get
- Set(ByVal value As TimeSpan)
- ChangePropIfDifferent(value, _runtime)
- End Set
- End Property
- Private _results As ObservableCollection(Of String) = New ObservableCollection(Of String)
- Public Property Results() As ObservableCollection(Of String)
- Get
- Return _results
- End Get
- Set(ByVal value As ObservableCollection(Of String))
- ChangePropIfDifferent(value, _results)
- End Set
- End Property
- Public ReadOnly Property StartMonkeysCommand As New RelayCommand(AddressOf StartMonkeysCommand_Execute, Function(o) TargetWord IsNot String.Empty)
- Private Sub StartMonkeysCommand_Execute(obj As Object)
- Runtimer.Reset()
- Dim neuerthread As System.Threading.Thread
- neuerthread = New System.Threading.Thread(AddressOf MonkeysAtWork)
- neuerthread.Start(TargetWord) 'Vorgang starten
- Runtimer.Start()
- End Sub
- Private Sub MonkeysAtWork(TargetWord As String)
- Dim Upd As New Update_UI(AddressOf Update_UISub)
- Dim Result As String = String.Empty
- Dim rnd As New Random
- Dim rndWord As New Text.StringBuilder
- Do Until Result = TargetWord
- Result = String.Empty
- For i As Integer = 0 To TargetWord.Length - 1
- rndWord.Append(Chr(rnd.Next(65, 90)))
- Next
- Result = rndWord.ToString
- Application.Current.Dispatcher.Invoke(Upd, Result)
- rndWord.Clear()
- Loop
- End Sub
- End Class
allerdings friert das Programm ein, wenn ich auf diese Weise versuche, mehrere Threads davon zu starten, aber es muss doch irgendwie möglich sein, meinen Prozessor damit auch wirklich auf Anschlag auszulasten, also mehrere Threads zeitgleich an so einer Aufgabe arbeiten zu lassen, oder nicht ?
If Energy = Low Then
Drink(aHugeCoffee)
Else
Drink(aHugeCoffeeToo)
End If
Drink(aHugeCoffee)
Else
Drink(aHugeCoffeeToo)
End If
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „asusdk“ ()