Timer zufallsgeneriert funktion audführen lassen

  • .NET (FX) 1.0–2.0
  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Timer zufallsgeneriert funktion audführen lassen

    Wunderschönen guten Morgen euch allen.

    Ich bräuchte kurz eine kleine hilfe.

    Ich möchte den Timer anweisen eine funktion, zur zufälligen zeit immer wiederholt ausführen zu lassen.

    Ist sowas möglich?

    Momentarner Code:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Timer1.Interval = "10000" ' = 10 Sekunden
    3. Timer1.Start()
    4. End Sub


    danke schon mal für euere hiilfe

    DJBasedream schrieb:

    Ist sowas möglich?
    Da musst Du im Timer-Tick-Event das Interval per Zufallszahl setzen.
    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!
    Also ich konnte mir da jetzt soweit,dank google folgendes zusammen stellen

    VB.NET-Quellcode

    1. Dim von As Integer = 60000 'Untergrenze
    2. Dim bis As Integer = 300000 'Obergrenze
    3. Dim Zufall As New Random
    4. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    5. Timer1.Interval = Zufall.Next(von, bis)
    6. End Sub
    7. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    8. My.Computer.Audio.Play("telefon.wav", _
    9. AudioPlayMode.BackgroundLoop)
    10. End Sub


    Also das Löst zwar das gewünschte Ereignis aus, nur leider nicht auf einem zufällig ausgewählten Zeitpunkt, was der Code wenn ich den richtig verstehe, eigentlich machen sollte.
    Das "von, bis", wenn ich das richtig verstehe, meint doch einen Zeitpunkt innerhalb des dort angegebenen zeitraumes oder?
    Also den beiden ms werten (Untergrenze, Obergrenze) zufolge, zwischen 1 und 5 Minuten, einen zufälligen zeitpunkt in diesem Zeitraum.

    Oder verstehe ich das alles falsch?

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

    Falls du willst, dass der Ton in einer Dauerschleife läuft nach einer zufälligen Zeit, dann kannst du mit Threading.Thread.Sleep oder ner Stopwatch arbeiten.

    VB.NET-Quellcode

    1. Private Sub Button_Click(sender As Object, e As EventArgs) Handles Button.Click
    2. Threading.Thread.Sleep(New Random().Next(60000, 300000))
    3. My.Computer.Audio.Play("telefon.wav", AudioPlayMode.BackgroundLoop)
    4. End Sub


    Der Timer macht für mich alleine schon deswegen keinen Sinn, da AudioPlayMode.BackgroundLoop das Ganze ja schon loopen lässt.
    Der Code sollte also demnach zufolge nach einer bestimmten Zeit einfach den Ton in einer Dauerschleife abspielen.

    Korrigiere mich wenn ich dich nicht richtig verstanden habe.

    Edit:
    Falls du den Hauptthread nicht blockieren willst (währenddessen auf deiner Form noch arbeiten willst), dann kannst du das ab Framework 4.5
    so machen:

    VB.NET-Quellcode

    1. Private Async Sub Button_Click(sender As Object, e As EventArgs) Handles Button.Click
    2. Await Task.Run(Sub()
    3. Threading.Thread.Sleep(New Random().Next(60000, 300000))
    4. My.Computer.Audio.Play("telefon.wav", AudioPlayMode.BackgroundLoop)
    5. End Sub)
    6. End Sub


    Oder eben mit nem separaten Thread:

    VB.NET-Quellcode

    1. Dim nThread As New Threading.Thread(Sub()
    2. Threading.Thread.Sleep(New Random().Next(60000, 300000))
    3. My.Computer.Audio.Play("telefon.wav", AudioPlayMode.BackgroundLoop)
    4. End Sub)
    5. nThread.Start()


    Achja.. Ist ausm Kopf geschrieben... Da hier irgendwie keine Tabs funktionieren, kann ich dadurch nicht richtig formatieren...

    MfG Tim

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Fortender“ ()

    Vielen dank,

    Es geht mir darum den ton nicht in einer schleife abzu spielen, weil die wird mit einem button den man dann drückt wenn das ereignis ausgeführt wird, wieder deaktiviert, und dann geht der timer von vorn los.

    Also prinzip:

    1. Zu einem zufälligen zeitpunkt innerhalb 10 Minuten, den ton abspielen,
    2. drücke den button bestätigen,
    - ton wiedergabe deaktiviert
    - timer neu gestartet
    - timer wählt neuen zeitpunkt inner halb des zeitraums 10 minuten aus zu dem er das ereignis erneut auslöst.

    Und dieses ganzes wiederholt sich immer wieder darum soll es gehen, ist eine fun software die ich mache.

    Probier das mal.. Musst du noch ein wenig anpassen...

    VB.NET-Quellcode

    1. Dim randomCallThread As Threading.Thread
    2. Private Sub StartRandomCall()
    3. If randomCallThread IsNot Nothing AndAlso randomCallThread.ThreadState = Threading.ThreadState.Running Then Return
    4. randomCallThread = New Threading.Thread(AddressOf RandomCall)
    5. randomCallThread.Start()
    6. End Sub
    7. Private Sub ButtonAcceptCall_Click(sender As Object, e As EventArgs) Handles ButtonAcceptCall.Click
    8. If randomCallThread Is Nothing _
    9. OrElse randomCallThread.ThreadState = Threading.ThreadState.Aborted _
    10. OrElse randomCallThread.ThreadState = Threading.ThreadState.AbortRequested _
    11. OrElse randomCallThread.ThreadState = Threading.ThreadState.Stopped Then Return
    12. If randomCallThread.ThreadState = Threading.ThreadState.Running Then randomCallThread.Abort()
    13. End Sub
    14. Private Sub RandomCall()
    15. Threading.Thread.Sleep(New Random().Next(2000, 10000))
    16. Do
    17. Try : My.Computer.Audio.Play("telefon.wav", AudioPlayMode.WaitToComplete)
    18. Catch ex As Threading.ThreadAbortException
    19. Exit Do
    20. End Try
    21. Loop
    22. End Sub
    23. Private Sub Form_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
    24. If randomCallThread Is Nothing OrElse randomCallThread.ThreadState = Threading.ThreadState.Aborted _
    25. OrElse randomCallThread.ThreadState = Threading.ThreadState.Stopped Then Return
    26. If MessageBox.Show(Me, "Do you really want to ignore the call and close this application?", "Ignore Call", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then
    27. randomCallThread.Abort()
    28. Return
    29. Else
    30. e.Cancel = True
    31. End If
    32. End Sub

    Nochmal das Ganze ein wenig erweitert, sodass beim Beenden der Form, falls der Thread noch läuft, der User gefragt wird, ob er wirklich beenden will.
    Ober-/Untergrenze musst du noch anpassen!
    Wenn du jetzt den Zufallsanruf starten willst rufst du einfach mit StartRandomCall() auf. Nach deiner Zufallswartezeit wirst du dann "angerufen" und mit einem Button
    "AcceptRandomCall" stoppst du das Ganze wieder. Bei mir funktionierts so, kann sein dass man das threading noch optimieren muss, aber C&P genug erstmal :P

    Musst ziemlich viel bearbeiten, hab eben im Halbschlaf ziemlich viel Müll zusammengecoded :D

    MfG Tim

    Dieser Beitrag wurde bereits 12 mal editiert, zuletzt von „Fortender“ ()

    DJBasedream schrieb:

    wenn ich den richtig verstehe
    Hast Du nicht.

    RodFromGermany schrieb:

    Da musst Du im Timer-Tick-Event das Interval per Zufallszahl setzen.
    Das sieht so aus (Form mit Timer, Button und Panel):

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private rnd As New Random
    3. Private index As Integer = 0
    4. Private col() As Color = {Color.Green, Color.Yellow}
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. Timer1.Enabled = Not Timer1.Enabled
    7. End Sub
    8. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    9. Timer1.Interval = rnd.Next(1000)
    10. Panel1.BackColor = col(index)
    11. index = 1 - index ' der nächste
    12. End Sub
    13. End Class

    @Fortender Lass es sein, so was wird nicht mit Sleep() gemacht.
    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!
    Meister was spricht dagegen? Deine Aussage musst du wenigstens begründen :thumbdown:
    Ich mag Timer nicht. Mit der Aussage kannst du auch nix anfangen^^
    Dein Button übrigens, macht genau das was er nicht soll nämlich den Timer ausschalten.

    Edit: Ich poste besser keinen Code mehr :D

    MfG Tim
    @Fortender sleep ist aus dem letzten Jahrhundert und wird nur noch in eigenständigen Threads (sinnvoll) eingesetzt, oder auf Mikroprozessoren (auch nicht mehr immer). Aber nie im GUI Thread, da dieser nach Möglichkeit immer bereit sein sollte(auf schlechter hw und schneller als dass es jeder Mensch merken kann)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Super @ RodFromGermany
    Vielen dank,

    Deine Lösung war mir verständlicher und einfacher, damit funktioniert es nun wie es soll.

    Eine frage bestünde eventuell das Interesse, meine Fun Software auszuprobieren, ich würde sie dann hier ins Showroom einstellen.

    @ Fortender

    Die Unsinnigen Code stellen habe ich entfernt, es stimmt da waren ein paar dinge die keinen Sinn ergaben.

    Fortender schrieb:

    Ich mag Timer nicht. Mit der Aussage kannst du auch nix anfangen^^
    1094 Beiträge im Forum und noch nix dazugelernt :?: :!: :?:

    Fortender schrieb:

    Dein Button übrigens, macht genau das was er nicht soll nämlich den Timer ausschalten.
    Lesen bildet.
    Du solltest Dir den Code noch mal gaaaaaaaaaaaaaaaaaaaaaaaanz genau ansehen:

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Timer1.Enabled = Not Timer1.Enabled
    3. 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!

    jvbsl schrieb:

    nur noch in eigenständigen Threads

    War ein eigenständiger Thread. Sinnvoll war es in dem Sinne nicht, da es mit dem Timer viel kürzer und unumständlicher funktioniert.
    Allerdings würde ich gerne etwas dazulernen, da ich mir ja den groben persönlichen Vorwurf des Meisters @RodFromGermany zu Herzen nehmen
    möchte. Wie würdest du eine sinnvolle Wartefunktion implementieren, sodass der GUI Thread bereit bleibt? Ich meine ich hätte vom EDR mal
    nen Waiter gesehen der auf der Stopwatch basiert, falls ich mich nicht irre.

    RodFromGermany schrieb:

    1094 Beiträge im Forum und noch nix dazugelernt

    Das mit dem Timer war ein Beispiel wie unbegründet man kommentieren kann.
    Vielen Dank :)
    Ich habe nicht so ein unglaublich breites Wissen wie du (der mir eigentlich keinen Vorwurf machen sollte, sondern mir beibringen wie es richtig geht) welches alle
    Bereiche der Programmierung beinhaltet :P Es gibt eben Bereiche in denen ich relativ wenig Zeit verbracht hab. Hinzu kommt noch, dass ich langezeit nicht programmiert habe.
    Kannst dich aber ruhig weiterhin lustig machen und mir dumm kommen :) Das Recht scheinst du ja dazu zuhaben mit deinen 30.000+ Beiträgen, Respekt. Weiter so :)

    Zu dem mit dem Timer deaktivieren. Der Button sollte eigentlich symbolisieren, dass wenn jemand anruft, er den Anruf entgegennimmt. Das was du in den
    Button geschrieben hast, ist ein Toggle (ein-aus-ein-aus... kennste). Es soll aber beim entgegennehmen so wie ich verstanden habe das Klingeln aufhören und die
    Prozedur neustarten. Kann sein, dass ich da was missverstanden habe bei deiner Lösung :P

    Dennoch freundliche Grüße,
    Tim

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

    Habs unter Windows 7 getestet, funktioniert einwandfrei. Spaßfaktor kann ich dir jetzt nicht nennen, da ich soweit noch nicht getestet habe.
    Ich denke du könntest noch irgendwelche Achievements einbauen oder sowas. Weil aktuell bis zu 10 Minuten auf nen Anrufer warten um dann nen Button
    zu drücken ist nicht sooo das krasse Spiel, zum Hineinfinden in die Programmierung aber gut geeignet denke ich
    @Fortender einen Thread lässt man idr nur warten, wenn man CPU zyklen sparen möchte, während man auf z.B. eine Werteänderung wartet(ja es gibt noch Fälle, wo gepollt werden muss). Für Timing Funktionen nimmt man nur einen extra Thread, wenn diese möglichst genau sein muss, da der Windows Timer meines Wissens nach "nur" eine Genauigkeit von 47ms hat. Der Windows Timer benötigt im vgl. zu einem Thread erstens keinen nennenswerten Speicher(Thread braucht einen eigenen Stack, es muss dem Thread CPU zeit zugewiesen werden usw.) und wird von Windows so oder so bereits abgearbeitet, also nur der Aufruf deiner Funktion verbraucht Zeit, und dies passiert bereits auf dem GUI-Thread->Thread Synchronisation ist somit auch nicht mehr nötig.
    Du siehst also der Timer ist nicht nur einfacher zu Implementieren, sondern verbraucht weniger Speicher und weniger Rechenleistung.

    Ansonsten gilt im Allgemeinen oftmals: Nicht das Rad neu erfinden.(Schlechte und unzureichende Implementierungen, sowie spielerei oder zur Bildung sind natürlich ausgeschlossen)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    Fortender schrieb:

    Wie würdest du eine sinnvolle Wartefunktion implementieren, sodass der GUI Thread bereit bleibt?
    Kann man mittm Async-Pattern machen: Async: einfaches Visualisieren von Algorithmen
    Einfach in einer Async-Methode einen Task.Delay Awaiten :D

    Aber ist hier nicht sinnvoll, weil
    1. vonne Resourcen her - bei einer Async-Warte-Funktion ist ja immer eine Task-Continuation anhängig - ich weiß nicht, wie das intern funktioniert, und ob das nicht doch mehr Overhead ist als good old Timer, der halt tickt, wenner tickt.
    2. hat eigene Tücken, nämlich wenn der User das Form schließt, und dann kommt der Task aus seiner Continuation und guckt aber blöde 8|
      Ist bei mit Timer für vorgesorgt: Das Schließen des Forms disposed auch den Timer, und dann tickt der auch nimmer.
    Also wie im Tut gezeigt - Async-Warte-Funktion ist schick, wenn man einen Algo hat, und man will ihn visualisieren, ohne die Architektur komplett umzustricken, sodass der Algo kaum noch kenntlich ist.