Verständnis EventHandler Sub

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    Verständnis EventHandler Sub

    Hallo,

    Wenn ich bspw. einen Button programmiere, dann mache ich das ja üblicherweise in so einem Sub:

    VB.NET-Quellcode

    1. ​Private Sub Button1_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click


    Bei einem etwas längerem Code, was passiert, wenn der Button mehrfach betätigt wird? Laufen dann mehrere Subs gleichzeitig?
    Hängt davon ab, was Du jetzt genau darunter verstehst. Wenn Du ein konkretes Problem hast, dann bitte beschreiben. Möglichkeiten gibt es sehr viele!
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Ich möchte einen Ordner überwachen, in dem Dateien erstellt werden. Mir ist die minimale Zeit, die zwischen zwei Erstellungen liegt nicht bekannt. Jedoch befürchte ich, dass es zuweilen zu kurz ist, dass:

    VB.NET-Quellcode

    1. Private Sub FilSystemWatcher1.Created(ByVal sender as System.Object, ByVal e as System.IO.FileSystemEventArgs) Handles FyleSystemWatcher1.Created

    etwas übersieht.

    Den Sub also möglichst kurz gestalten ist schonmal Risikominimierung. Ich denke das kürzest Mögliche wäre den Sub nur zum Notieren der Änderungen zu verwenden und außerhalb davon dann zu agieren. ???

    Aber schöner wäre es, wenn man sich sicher sein kann, dass nichts übersehen würde.

    Nachtrag: Wenn Code außerhalb des Sub abläuft ist der Sub dann auch immer noch blockiert? Dann wäre mein Vorschlag natürlich nutzlos.
    Ein etwas heikles Thema in Deiner ggf. (!) Einstiegsprogrammierlage: Du könntest den Prozedurcode asynchron laufen lassen, Einlesethema: Async/Await
    Aber bevor Du da spekulationierst: Probier erstmal aus, ob der FSW wirklich was verschluckt.

    Haudruferzappeltnoch schrieb:

    Wenn Code außerhalb des Sub abläuft
    Falls das so gemeint ist:

    VB.NET-Quellcode

    1. Private Sub FilSystemWatcher1.Created(ByVal sender as System.Object, ByVal e as System.IO.FileSystemEventArgs) Handles FyleSystemWatcher1.Created
    2. MachWas()
    3. End Sub
    4. Private Sub MachWas()
    5. End Sub
    Vergiss es, ist genauso GUI-blockierend identisch, als wäre alles in einer Sub.

    btw: der Sub -> die Sub; Kurzform von die Sub-Prozedur/die Unterprozedur. Also weiblich.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Nein. Der FSW arbeitet an sich schon asynchon zum Hauptthread. Wenn eine heavy Sub läuft und das GUI blockiert, kann der FSW trotzdem Events raushauen und Dein Programm bekommt das mit und ruft FileSystemWatcher1_Created auf und arbeitet sie ab.
    Oh, das hab ich wohl falsch in Erinnerung gehabt. Wenn eine andere Sub das GUI blockiert, kommt doch nix bei den FSW-EventHandlern an :(

    btw: Du hast schon wieder den Syntaxfehler aus Post1 drin. Die Sub darf keinen . im Namen enthalten!

    ##########

    @Haudruferzappeltnoch: Kannst Dein Hilfreich wieder zurücknehmen, hab mich getäuscht, siehe Edit.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ah ok, dann habe ich ggf. also zwei verschiedene Subs laufen. Können die z.B. über eine Public Variable währenddessen miteinander "reden"? Oder sieht die eine Sub die Änderungen der Anderen nicht an der Variable?
    Ist vom Ablauf schon recht abstrakt, aber vllt. nur zum Verständnis was da genau passiert.

    SpaceyX schrieb:

    Nein, Deine Anwendung blockiert solange der Rechner braucht um den Code abzuarbeiten.
    Das ist falsch.
    Probiere diesen Code in einem neuen Projekt aus. 1 Button, 4 Labels:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Counter As Integer = 0
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim lbls() = {Label1, Label2, Label3}
    5. lbls(Counter Mod 3).Text = Counter.ToString()
    6. Counter += 1
    7. For i = 1 To 1000
    8. Application.DoEvents()
    9. Threading.Thread.Sleep(10)
    10. Next
    11. Label4.Text = "durch"
    12. End Sub
    13. End Class
    Starte das Programm und klicke im Sekunden-Takt auf den Buttun.

    ===========================
    @Haudruferzappeltnoch
    Probiere folgendes aus:

    VB.NET-Quellcode

    1. Private Counter As Integer = 0
    2. Private Sub FilSystemWatcher1.Created(ByVal sender As System.Object, ByVal e As System.IO.FileSystemEventArgs) Handles FyleSystemWatcher1.Created
    3. Dim lbls() = {Label1, Label2, Label3}
    4. lbls(Counter Mod 3).Text = Counter.ToString()
    5. Counter += 1
    6. End Sub

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Boah! DoEvents - echt?

    MSDN schrieb:

    Caution
    Calling this method causes the current thread to be suspended while all waiting window messages are processed. If a message causes an event to be triggered, then other areas of your application code may execute. This can cause your application to exhibit unexpected behaviors that are difficult to debug. If you perform operations or computations that take a long time, it is often preferable to perform those operations on a new thread. For more information about asynchronous programming, see Asynchronous Programming Model (APM).

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    echt?
    Es ging ausschließlich um die Aussage von @SpaceyX, die ich experimentell widerlegt habe.
    Klar, das Beispiel ist dahingehend schlecht, aber funktional.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Haudruferzappeltnoch lbls() ist eine lokale Array-Variable, wo ich mit einem Index auf die verschiedenen Label zugreife.
    Wenn Du solch in anderen Prozeduren benötigst, leg Dir eine Variable im Scope der Klassen an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Das ist falsch.


    Hauptsache, man hat recht behalten. Egal, wie schlecht das Beispiel auch ist. Ich bin raus hier.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Vielleicht hilft dir das ja:

    Ich hab den FileSystemWatcher in einer meiner Programme wie folgt verwendet:

    Der FSW überwacht einen bestimmten Ordner. Sobald eine Datei Erstellt wird, springt der FSW an und startet einen Countdown (Timer), welcher wenn er abgelaufen ist bestimmte Dinge tut. Wird währenddessen wieder eine Datei erstellt, so wird der Countdown an den Anfang gesetzt. Ist der Countdown abgelaufen, werden alle Dateien aus dem Ordner „verarbeitet“ und der Countdown wiederum gestoppt.

    Das habe ich gemacht, damit wenn jemand viele Dateien in den Order kopiert, mein Programm erst richtig los legt, wenn alle Dateien kopiert sind.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Haudruferzappeltnoch schrieb:

    @mrMo Magst du einen Teil des Codes zeigen?
    Ne Code habe ich keinen für dich.

    Das created Event des FSW wir jedes Mal ausgelöst wenn eine Datei erstellt wird. Kopiere ich also 3 Dateien in den zu überwachenden Order, wird das Event 3 Mal ausgelöst. Also wird der Countdown bei der Ersten Datei gestartet und dann bei Datei 2 und 3 jeweils zurück gesetzt. Nach dem kopieren der 3. Datei läuft der Countdown irgendwann auf 0 und das Elapsed Event des Timers wird ausgelöst. Dort kann man dann mit den Dateien Dinge tun.

    Der Countdown ist ein Timer, welcher nach x Millisekunden das Elapsed Event auslöst. docs.microsoft.com/de-de/dotne…imer.elapsed?view=net-5.0
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Haudruferzappeltnoch schrieb:

    Wie überwachst du innerhalb des Events, ob ein weiteres Event passiert?
    Wenn der Code in Ordnung ist, sollte das nicht erforderlich sein.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!