[VB.NET] Funktionen ständig laufen lassen

Hallo,

ich bin dabei ein programm zu schreiben. Nun würde ich gerne eine Bestimmte Funktion im "Hintergrund" laufen lassen um zu prüfen ob eine IP-Adresse im Netzwerk erreichbar ist.

Mein Problem bei der ganzen Sache ist das ich momentan keine funktionierende Moglichkeit gefunden habe ( Google etc ). Deshalb die Frage an euch. Wie kann ich einfach und unkompliziert eine Funktion ständig im Hintergrund laufen lassen die alle 10 Sek. prüft ob eine IP erreichbar ist? Wobei allerdings ein weiteres Arbeiten möglich ist. :confused::confused::confused:

mfg/mvh Marc
 
Dies erledigst du am einfachsten, indem du einen neuen Thread öffnest, in dem deine Prüfung läuft.
Alternativ schau dir mal die BackgroundWorker Klasse an. Diese startet auch einen eigenen Thread der dann quasi parallel zu deinem Programm läuft.
 
Hi,

erstmal danke für deine Antwort. ;-)

ich habe mich auch gleich daran gemacht und etwas zusammen gebastelt. Leider bin ich jetzt auf folgendes Problem gestossen. Ich starte eine Thread .... und der läuft auch im Hintergrund.... Aber wie stope ich ihn wieder ?

Ich habs damit probiert...

Code:
Private Sub StopToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StopToolStripMenuItem.Click
        Dim Thread As New Threading.Thread(AddressOf Load_Data)
        Thread.Abort()
    End Sub

.... aber passieren tut dabei nichts. Ich denk mal das ich so nicht den von mir gestarteten Thread anspreche... Oder!

Code:
Public Sub Load_Data()
        Try
            PBStatus.Image = ServerAudit.My.Resources.green
            Application.DoEvents()
            Thread.Sleep(3000)

            PBStatus.Image = ServerAudit.My.Resources.red
            Application.DoEvents()
            Thread.Sleep(3000)

        Catch ex As ThreadAbortException

        End Try
        Load_Data()
    End Sub

    Private Sub StartToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StartToolStripMenuItem.Click
        Dim Thread As New Threading.Thread(AddressOf Load_Data)
        Thread.Start()
    End Sub

    Private Sub StopToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StopToolStripMenuItem.Click
        Dim Thread As New Threading.Thread(AddressOf Load_Data)
        Thread.Abort()
    End Sub
 
Ich habe das jetzt selber ausprobiert und eine kleine Lösung gebastelt.

Visual Basic:
Imports System.Threading

Public Class Form1
    Private thread As Thread = New Threading.Thread(AddressOf DoThreadStuff)
    Private abortThread As Boolean = False

    Private Sub DoThreadStuff()
        Do
            thread.Sleep(1000)
        Loop Until abortThread
        MsgBox("Beenden!")
        thread.Abort()
    End Sub

    Private Sub btStartThread_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btStartThread.Click
        thread.Start()
    End Sub

    Private Sub btStopThread_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btStopThread.Click
        abortThread = True
        thread.Join()
    End Sub
End Class

Kurze Erklärung
Den Thread habe ich als privates Member global innerhalb der Klasse zur Verfügung gestellt. Außerdem einen Boolean, der auf True gesetzt wird, wenn man den Thread beendet. Die Rekursion, die durch im Load_Data machst, habe ich durch einen Do...Loop ersetzt. Der Rest sollte eigentlich selbsterklärend sein.

Hinweis:
Was grundsätzlich gefährlich ist, weil es zu deadlocks führen kann, du manipulierst aus deinem Thread heraus direkt Elemente auf dem Formular. Eventuell solltest du das gesamte Threading in eine seperate Klasse auslagern und die Statusänderungen über Events signalisieren. Diese verarbeitest du im Form.
 

Neue Beiträge

Zurück