Thread Erstellen

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Fakiz.

    Thread Erstellen

    Hey, Hey

    Ich Versuche verzweifelt ein Thread zu Erstellen und auszuführen aber
    leider wird es gar nicht oder nur 1 mal Ausgeführt.
    Mein Code :

    VB.NET-Quellcode

    1. Imports System.Threading
    2. Module LoadProcesses
    3. Public MyThread As New System.Threading.Thread(AddressOf MachWas)
    4. Public Sub MachWas()
    5. Dim oItem As ListViewItem
    6. With ListView1
    7. .Items.Clear()
    8. For Each oProcess As Process In Process.GetProcesses
    9. oItem = .Items.Add(oProcess.ProcessName)
    10. Try
    11. oItem.SubItems.Add(oProcess.MainModule.FileName)
    12. Catch
    13. oItem.SubItems.Add("")
    14. End Try
    15. Next
    16. End With
    17. End Sub
    18. End Module


    Und das ist der Start Code in der Form :

    VB.NET-Quellcode

    1. MyTheard.Start()


    Kann mir da jemand helfen?

    LG
    Warum ein Modul?

    Hast Du mal Haltepunkte gesetzt und geprüft, ob der Code ausgeführt wird? Wenn ja, dann musst Du invoken, da Du aus einem anderen Thread keinen Zugriff auf GUI-Elemente hast. Lass das mit dem Modul. Das brauchst Du höchstens für Extensions, sonst nicht.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    War für mich so im Moment die beste Lösung ich arbeite sehr sehr seht Selten mit Threads.

    Ja, Habe ich schon und er wird auch Ausgeführt.
    Aber eben nur 1 mal oder gar nicht.

    Also, soll ich das am besten im FormCode machen?

    LG
    Ich würde hier gar keinen Thread in dem Sinne verwenden, sondern die Aktualisierung in den Elapsed-EventHandler eines Timers.Timer auslagern und von dort aus invoken. Ein Timers.Timer arbeitet in einem eigenen Thread. Somit erreichst Du das selbe Ergebnis.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Gut, danke.

    Habe nun ein System.Timers.Timer Erstellt.
    Aber wie du schon Sagtest kann ich auf das UI nicht Zugreifen.
    Wie kann ich das Lösen?

    VB.NET-Quellcode

    1. Imports System.Timers
    2. Imports System
    3. Public Class TaskManager
    4. Private Shared aTimer As System.Timers.Timer
    5. Public Shared Sub Main()
    6. aTimer = New System.Timers.Timer(10000)
    7. AddHandler aTimer.Elapsed, AddressOf LoadProcesses
    8. aTimer.Interval = 2000
    9. aTimer.Enabled = True
    10. End Sub
    11. Private Shared Sub LoadProcesses(source As Object, e As ElapsedEventArgs)
    12. Dim oItem As ListViewItem
    13. With TaskManager.ListView2
    14. .Items.Clear()
    15. For Each oProcess As Process In Process.GetProcesses
    16. oItem = .Items.Add(oProcess.ProcessName)
    17. Try
    18. oItem.SubItems.Add(oProcess.MainModule.FileName)
    19. Catch
    20. oItem.SubItems.Add("")
    21. End Try
    22. oItem.SubItems.Add(oProcess.Id.ToString)
    23. oItem.SubItems.Add(oProcess.PrivateMemorySize64.ToString("N0"))
    24. Next
    25. End With
    26. End Sub
    27. Private Sub TaskManager_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    28. Main()
    29. End Sub
    30. End Class


    LG
    Ich hab Dir doch Invoke/BeginInvoke als Lösung genannt. Wo genau weißt Du nicht, wie Du es einsetzen musst?
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Na, im Elapsed-EventHandler. An der Stelle, wo Du auf ein Control zugreifst. Wenn es schon ListView sein muss, dann leg Dir zuerst eine List(Of ListViewItem) an, erzeuge aus der Liste der Processes die ListViewItems mit den gewünschten Informationen und füge dann in einem Rutsch (per ListView.AddRange()) die Items ein.

    VB.NET-Quellcode

    1. ListView1.BeginInvoke(Sub()
    2. ListView1.Items.AddRange(list.ToArray())
    3. End Sub)
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    So würde ich das Regeln:

    VB.NET-Quellcode

    1. If listView1.InvokeRequired Then
    2. listView1.Invoke(New MethodInvoker(Sub() listView1.Items.AddRange(GetProcessesAsLvItem())))
    3. else
    4. listView1.Items.AddRange(GetProcessesAsLvItem())
    5. End If


    VB.NET-Quellcode

    1. Private Function GetProcessesAsLvItem() As ListViewItem()
    2. Dim pp As System.Diagnostics.Process() = System.Diagnostics.Process.GetProcesses()
    3. Dim ProcessList As ListViewItem() = New ListViewItem(pp.Length - 1) {}
    4. For i As Integer = 0 To pp.Length - 1
    5. Dim item As New ListViewItem()
    6. item.Text = pp(i).ProcessName
    7. If pp(i).MainWindowTitle <> "" Then
    8. item.SubItems.Add(pp(i).MainWindowTitle)
    9. Else
    10. item.SubItems.Add("NoMainWindowTitle")
    11. End If
    12. ProcessList(i) = item
    13. Next
    14. Return ProcessList
    15. End Function


    Wenn du nun aber doch einen Timer verwenden willst/mußt dann deklariere den Timer in deiner Form "Taskmanger". Und erstelle dir z.B. in einer Klasse eine Function die dir ein ListViewArray zurückgibt. Dann kannst du im Timer -Event deine Listview aktuallisieren.