none
Ping-Ausfürhung mit Tastenkürzel beenden RRS feed

  • Frage

  • Hallo zusammen

    Ich habe folgenden Code (die Prozedur 'subUpdatePingLabel' dient nur zur schönen Ansicht in der Form):

    Private Sub Ping_Click(sender As System.Object, e As System.EventArgs) Handles btnPing.Click Dim pingSender As New Ping() Dim options As New PingOptions() options.DontFragment = True Dim data As String = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" Dim buffer As Byte() = System.Text.Encoding.ASCII.GetBytes(data) Dim timeout As Integer = 120 Dim address As String address = txtPing.Text ' "173.194.112.24" Dim sended As Integer = 0 Dim received As Integer = 0 Dim lost As Integer = 0 Dim times As New List(Of Long)
    Dim lngNumerOfPings As Long = txtNumberOfPings.Text If lngNumerOfPings = vbNullString Then lngNumerOfPings = 4 subUpdatePingLabel("Ping wird ausgeführt für " & address & " mit " & buffer.Length & " Bytes Daten:") For i As Integer = 0 To lngNumerOfPings - 1 Sleep(1000) Dim reply As PingReply = pingSender.Send(address, timeout, buffer, options) If reply.Status = IPStatus.Success Then subUpdatePingLabel(i + 1 & ". Antwort von " & reply.Address.ToString() & ": Bytes=" & buffer.Length & " Zeit=" & reply.RoundtripTime & "ms TTL=" & reply.Options.Ttl) received += 1 '1 Paket empfangen' Else lost += 1 '1 Paket verloren' If reply.Status = IPStatus.TimedOut Then subUpdatePingLabel("Timeout") Else 'Am besten noch weiter auseinander nehmen' subUpdatePingLabel("Sonstiger Fehler") End If End If sended += 1 '1 neues Paket wurden gesendet' times.Add(reply.RoundtripTime) 'Vergangene Zeit bei dem Ping' Threading.Thread.Sleep(200) 'Kurze Zeit warten, macht ping.exe auch - dadurch werden scheinbar timeouts verhindert' Next End Sub

    Der Code funktioniert auch sehr gut, alles kein Problem.

    Jetzt zu meiner Frage: Ich möchte dem User die Möglichkeit geben, die Ausführung dieses Codes abzubrechen, am idealsten mit "ctrl + c" (gleicher Befehl wie im DOS-Fenster). Wie kann ich das erreichen?


    Danke und Gruss Thomas



    • Bearbeitet Alphawolfi Freitag, 23. Januar 2015 09:33
    Freitag, 23. Januar 2015 08:37

Antworten

Alle Antworten

  • Hallo,

    dein Code läuft momentan synchron zur GUI. Diese wird somit blockiert bis die Methode beendet wurde. Das muss zunächst geändert werden. Hierfür kannst du beispielsweise einen BackgroundWorker einsetzen (zu finden in der Toolbox von WinForms.)
    In dessen DoWork-Event kannst du dann deinen Code asynchron ausführen. Beachte hierbei dass du Zugriffe auf die GUI über die Invoke-Methode regeln musst. Threading ist sehr komplex, ich empfehle dir daher dich eingehender damit zu beschäftigen. Siehe unter anderem: VB.NET Tipps: Multithreading
    (Ab .NET 4.5 gibt es auch noch Async und Await, die kannst du natürlich auch verwenden)

    Den BackgroundWorker hat auch eine CancelAsync-Methode um die Ausführung wieder anzuhalten. Das solltest du unter Windows zunächst hinter einen Button- oder Menüpunkt packen, schließlich gibt es auch Leute die keine Tastenkombinationen mögen bzw. nur noch OnScreen Keyboards haben.

    Nun kannst du einen IMessageFilter implementieren. Mit diesem kannst du vor dem Fenster eine Tastenkombination abfangen und entsprechend verarbeiten. Ein Beispielcode dazu findest du hier. Informationen zur gedrückten Taste erhälst du dort aus den WParam- und LParam Parametern. Siehe auch: WM_KEYDOWN.

    PS: Stelle besser Option Strict auf On. Die Fehler die dir dann gemeldet werden, solltest du besser korrigieren um Laufzeitfehler zu vermeiden.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Freitag, 23. Januar 2015 17:31
    Moderator
  • Hallo

    Vielen Dank für Deine Antwort. Da mein Wissen aber noch ziemlich Basic ist werde ich mich vor der Implementation zuerst vertieft auseinandersetzen.

    Option Strict = on habe ich gemacht. Danke.

    Jetzt habe ich aber noch eine andere Frage zur gleichen Anwendung (es hat noch ein paar Prozeduren mehr): Die Exe aus dem Bin\Debug-Ordner verschiebe ich zu Testzwecken auf meinem PC in diverse Ordner, Lokal und Netz. Ich kann sie immer öffnen.

    Wenn ich an einem anderen PC bin (auch W7, gleicher Patchstatus, gleiche Berechtigungen, Test mit verschiedenen Usern) kommt immer gleich die Meldung dass das Programm nicht funktioniert: "abTool funktioniert nicht mehr. Ein Problem hat die richtige Ausführung dieses Programms verhindert. Schliessen sie das Programm."

    Wenn jemand anders an meinem PC einloggt dann funktioniert es auch.

    Ich habe keine externen Daten eingebunden und kann mir so nicht erklären, an was es liegt. Any ideas?


    Danke und Gruss Thomas

    Montag, 26. Januar 2015 14:05
  • Hallo,
    erstelle in Zukunft bei neuen Fragen bitte einen neuen Thread. Ich mache hier mal eine Ausnahme diesbezüglich.

    Gucke bitte auf den PCs, wo der Fehler auftritt, ins Ereignisprotokoll und den Zuverlässigkeitsverlauf. Dort sollten weitere Fehlerdetails erscheinen. Sonst musst du den Fehler weiter einschränken, beispielsweise indem du alle unbehandelten Ausnahmen protokollierst. Siehe dazu: AppDomain.CurrentDomain.UnhandledException


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Mittwoch, 28. Januar 2015 22:28
    Moderator