Schleife unterbrechen (DoEvents ist zu langsam)

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ania.

    Schleife unterbrechen (DoEvents ist zu langsam)

    Ich will eine Schleife vom Benutzer unterbrechen lassen. DoEvents nimmt zu viel zeit in Anspruch (es dauert länger als die Schleife selber dauern soll).

    Die Schleife soll 100 ms lang dauern, das DoEvents dauert aber manchmal mehr als 100.
    Das Hauptprogramm allein braucht nur etwa 15 ms.
    Der Code mit DoEvents hat so ausgesehen:

    VB.NET-Quellcode

    1. Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
    2. For t = 1 To 2147483640
    3. If stopGeklickt = False Then
    4. Application.DoEvents()
    5. 'HAUPTPROGRAMM
    6. ElseIf stopGeklickt = True Then
    7. Exit For
    8. End If
    9. Next t
    10. End Sub
    11. Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click
    12. stopGeklickt = True
    13. End Sub


    Ich habe noch mit GetAsyncKeyState versucht:

    VB.NET-Quellcode

    1. Private Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal nVirtKey As Integer) As Short
    2. Private Const VK_ESCAPE As Long = &H1B& 'ESC-Taste
    3. Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
    4. For t = 1 To 2147483640
    5. Taste = GetAsyncKeyState(VK_ESCAPE)
    6. If CBool(Taste And &H1) Then
    7. MsgBox("Messvorgang abgebrochen")
    8. Exit For
    9. End If
    10. 'HAUPTPROGRAMM
    11. Next t
    12. End Sub


    Das funktioniert insofern, dass die Schleife tatsächlich mit ESC unterbrochen wird und es auch keine Zeitverzögerung gibt wie mit DoEvents.
    Allerdings wird sie auch nicht mehr ganz richtig ausgeführt, und zwar friert ein Videobild, das innerhalb der Schleife ausgelesen wird, ein (nicht nur die Anzeige, sondern auch eine Kantensuche in diesem Bild, liefert die ganze Schleife durch den selben Wert).

    Gibt es noch eine andere Möglichkeit, eine Schleife zu unterbrechen, am besten mit einem Button?
    Hab das versucht (mit t mod 10), jetzt liefert aber die Kantensucha in der Schleife nur alle 10 Durchgänge ein neues Ergebnis :(

    Habe noch dieses probiert, aber auch da friert das Bild ein:

    VB.NET-Quellcode

    1. If GetInputState() Then Application.DoEvents()


    Obwohl in der Schleife eine Funktion aufgerufen wird, die eigentlich das Bild auffrischen sollte. Ich glaub mittlerweile, dass nicht DoEvents mein Hauptproblem ist sondern dieses Video. Werde noch in diese Richtung nach Lösungen suchen.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ania“ ()

    hallo ania,

    das mit dem thread (z.b. backgroundworker) wollte ich gestern schon anbringen.
    war mir aber nicht sicher, was du genau erreichen willst.

    du sprichst von
    Die Schleife soll 100 ms lang dauern

    stellst aber einen code wie diesen

    VB.NET-Quellcode

    1. For t = 1 To 2147483640
    2. ....

    rein.

    kannst du mir da mal auf die sprünge helfen ?

    gruss

    mikeb69
    Ja. Die Schleife so wie sie hier ist, ist nicht vollständig. Am Ende der Schleife ist noch ein Sleep, das den Rest der Zeit bis zu den 100 ms abwartet und erst dann die Schleife von neuem startet.

    2147483640 mal 100 ms sind über ein Jahr, so lang wird die Schleife niemals laufen, wird vorher vom Benutzer abgebrochen. Das For ist nur, weil ich manchmal zu Testzwecken z.b. 20 Durchläufe machte, und später wird es vielleicht durch eine vom Benutzer definierbare Variable ersetzt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ania“ ()