Avatar billede ux Nybegynder
09. januar 2008 - 19:32 Der er 6 kommentarer og
1 løsning

Thread spørgsmål

Hej Eksperter!

Jeg sidder lige med et Thread eksempel... som jeg har brug for lidt hjælp til:

Jeg har en textbox og button1 samt button2 på min windows form.

Ved tryk på button1, startes der en ny tråd som skriver noget tekst til tekstboksen med 100 millisek interval.

Det jeg godt vil have hjælp til er, hvordan stopper jeg denne kørende tråd ved tryk på button2, før tråden stopper af sig selv?

Kode:


Imports System.Threading

Public Class ThreadTest
  Dim threadCount As Integer


  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim ca As New CounterArgs()
    Dim iterations As Integer = 50
    ca.Iterations = iterations
    ca.StartDelegate = AddressOf Count
    Dim t As New Thread(AddressOf ca.StartCounting)
    threadCount += 1
    t.Name = "Thread " & threadCount.ToString()
    Console.WriteLine("Starting thread " & t.Name & " to count " & iterations & " times.")
    t.IsBackground = True
    t.Start()
  End Sub

  Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    'I denne Sub vil jeg gerne kunne stoppe tråden fra Button1_Click
    'Hvordan hulen gør jeg det?
  End Sub

  Private Sub Count(ByVal iterations As Integer)
    Dim i As Integer
    Dim t As Thread = Thread.CurrentThread
    For i = 0 To iterations
      If Me.TextBox1.InvokeRequired Then
        Me.TextBox1.Invoke(New ChangeTextControlDelegate(AddressOf SetDisplayText), New Object() {t.Name, TextBox1, i.ToString})
      Else
        Me.SetDisplayText(t.Name, TextBox1, i.ToString)
      End If
      If Me.TextBox1.InvokeRequired Then
        t.Sleep(100)
      End If
    Next
    If Me.TextBox1.InvokeRequired Then
      Me.TextBox1.Invoke(New ChangeTextControlDelegate(AddressOf SetDisplayText), New Object() {t.Name, TextBox1, "Ending Thread"})
    Else
      Me.SetDisplayText(t.Name, TextBox1, "Ending Thread")
    End If
  End Sub

  Public Sub SetDisplayText(ByVal aThreadName As String, ByVal aTextBox As TextBox, ByVal newText As String)
    If aTextBox.Text.Length + newText.Length > aTextBox.MaxLength Then
      aTextBox.Text = Strings.Right(aTextBox.Text, 1000)
    End If
    aTextBox.AppendText(aThreadName & ": " & newText & System.Environment.NewLine)
  End Sub

  Delegate Sub ChangeTextControlDelegate(ByVal aThreadName As String, ByVal aTextBox As TextBox, ByVal newText As String)
  Delegate Sub StartCounterDelegate(ByVal iterations As Integer)

  Private Class CounterArgs
    Public Iterations As Integer
    Public StartDelegate As StartCounterDelegate

    Public Sub StartCounting()
      StartDelegate(Iterations)
    End Sub
  End Class


End Class
Avatar billede spil2vind Nybegynder
09. januar 2008 - 22:53 #1
Du er jo nødt til at lave check for click på button2 i din kode, altså en form for exist, du skal bruge en global variable, som du kan checke på
Avatar billede ux Nybegynder
10. januar 2008 - 08:20 #2
En Global variabel er vel ikke en særlig god ide, hvis man nu på en senere tidspunkt antager man har x-antal tråde startet...
Avatar billede ux Nybegynder
10. januar 2008 - 20:18 #3
Er der ikke nogle der har et bud på dette? Vil gerne give 200 point for et svar jeg kan bruge til noget...
Avatar billede arne_v Ekspert
13. januar 2008 - 04:01 #4
Eksempel:

Imports System
Imports System.Threading

Public Class Form1
    Private done As Boolean
    Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
        done = False
        Dim t As Thread = New Thread(AddressOf TextUpdateThread)
        t.Start()
    End Sub
    Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
        done = True
    End Sub
    Private Sub TextUpdateThread()
        Dim i As Integer = 0
        While Not done
            i = i + 1
            If TextBox1.InvokeRequired Then
                TextBox1.Invoke(New TextUpdateHandler(AddressOf TextUpdate), New Object() {i})
            Else
                TextUpdate(i)
            End If
            Thread.Sleep(1000)
        End While
    End Sub
    Private Delegate Sub TextUpdateHandler(ByVal n As Integer)
    Private Sub TextUpdate(ByVal n As Integer)
        TextBox1.Text = n.ToString()
    End Sub
End Class
Avatar billede ux Nybegynder
14. januar 2008 - 08:37 #5
Fantastisk Arne - det var lige det jeg skulle bruge for at komme videre.

Smid et svar, men hvordan overfører jeg de resterende 140 point til dig?
Avatar billede tjacob Juniormester
14. januar 2008 - 12:02 #6
Du kan godt forhøje det antal points du har udlovet. Se her: http://www.expfaq.dk/flere_point_end_lovet#flere_point_end_lovet
Avatar billede arne_v Ekspert
14. januar 2008 - 13:24 #7
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester