2016-05-03 10 views
1

Ich habe eine Schleife (in einer anderen Klasse), was ich aufhören soll, wenn ich eine Taste drücken, aber ich weiß nicht, wie es zu tunvb.net - Stop Schleife, wenn ich Knopf drücken

Das ist mein Code :

'My FORM 

Dim blStop = False 

Private Sub btnFilter_Click(sender As Object, e As EventArgs) Handles btnFilter.Click 
     AnotherClass.doTheLoop(blStop) 
End Sub 

Private Sub btnStop_Click(sender As Object, e As EventArgs) Handles btnStop.Click 
     blStop = True 
End Sub 



'AnotherClass Loop 

While (blStop = False) 
    'blablabla 
End While 
+1

Was die Linie ist, die blStop erklärt? Auch sollte Ihre 'AnotherClass' Definition den Parameter' blstop' nicht enthalten. Ihr Code in der Klasse behandelt ihn als lokale Variable und nicht als Variable, die außerhalb der Klasse definiert wurde. –

+0

Sie sollten wahrscheinlich blstop als Static erklären als auch –

+0

@MattWilko Dies ist der Code: Public Sub doTheLoop (blStop als Boolean) While (blStop = False) ‚blablabla End While End Sub – cnbandicoot

Antwort

1

Ihr Problem ist folgendes:

Public Sub doTheLoop(blStop as Boolean) 
    While (blStop = False) 
     'blablabla 
    End While 
End Sub 

die Erklärung von blStop, eine neue Variable erstellt, so dass, wenn Sie den Wert auf false festgelegt, stellen Sie nur die eine lokal decalred.

Eine schnelle und dreckige Lösung wäre, den booleschen Wert ByRef zu deklarieren - das würde bedeuten, dass er immer noch auf die ursprüngliche Variable verweist.

Public Sub doTheLoop(ByRef blStop as Boolean) 
    While (blStop = False) 
     'blablabla 
    End While 
End Sub 

Eine bessere Lösung wäre eine Methode in der Klasse zu haben, die Sie anrufen, wenn Sie lieber aufhören wollen als runde Variablen übergeben.

+0

Diese Schleife wird nie aufhören, weil sie vom UI-Thread aufgerufen wird ... Die UI wird eingefroren, bis die Schleife vorbei ist, so dass der Benutzer niemals die Taste drücken kann, um die Schleife zu stoppen ... –

+0

@SuperPeanut - hängt ab, was in 'blablabla ist ' –

+0

Einverstanden. Lass uns nur hoffen, dass da ein 'Application.DoEvents()' drin ist ... –

1

Hier ist, wie Sie Ihre anderen Klasse sollte wie folgt aussehen:

Public class AnotherClass 
    Private Shared blStop As Boolean = False 

    'blablabla 

    Public Shared Sub doTheLoop() 
     While Not blStop 
      'blablabla 
     End While 
    End Sub 

    Public Shared Sub StopTheLoop() 
     blStop = True 
    End Sub 

    'blablabla 
End Class 

Dann können Sie diese Schleife wie folgt aufrufen:

'Form class 
Private Sub btnFilter_Click(sender As Object, e As EventArgs) Handles btnFilter.Click 
    'You must run the loop on another thread or you will block the UI thread. 
    'Therefore your application will 'Stop Responding' 
    System.Threading.Thread.QueueWorkUserItem(AddressOf(AnotherClass.DoTheLoop)) 
End Sub 

Private Sub btnStop_Click(sender As Object, e As EventArgs) Handles btnStop.Click 
    AnotherClass.StopTheLoop() 
End Sub 
Verwandte Themen