ThreadLoop

  • .NET (FX) 3.0–3.5
  • C#

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

    Was haltet ihr davon ?

    Spoiler anzeigen

    C#-Quellcode

    1. public class ThreadLoop
    2. {
    3. private delegate void ThreadLoopHandle();
    4. private ThreadLoopHandle ThreadLoopEvent;
    5. private Action Action;
    6. private int Delay;
    7. public uint LoopCount;
    8. public ThreadLoop(Action action, int delay = 0)
    9. {
    10. Action = action;
    11. Delay = delay;
    12. }
    13. //public ThreadLoop(double start, double end, double step, Action action, int delay = 0)
    14. //{
    15. // Action = action;
    16. // Delay = delay;
    17. //}
    18. public void Start()
    19. {
    20. ThreadLoopEvent += InnaStart;
    21. new SySThread.Thread(Start).Start();
    22. }
    23. private void InnaStart()
    24. {
    25. LoopCount += 1;
    26. Action();
    27. SySThread.Thread.Sleep(Delay);
    28. ThreadLoopEvent?.Invoke();
    29. }
    30. public void Stop() => ThreadLoopEvent = null;
    31. }


    ~blaze~: Thema verschoben

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

    Fix
    Spoiler anzeigen

    C#-Quellcode

    1. public class ThreadLoop
    2. {
    3. private delegate void ThreadLoopHandle();
    4. private ThreadLoopHandle ThreadLoopEvent;
    5. private Action Action;
    6. private int Delay;
    7. public uint LoopCount;
    8. public ThreadLoop(Action action, int delay = 0)
    9. {
    10. Action = action;
    11. Delay = delay;
    12. }
    13. public void Start()
    14. {
    15. ThreadLoopEvent += InnaStart;
    16. new SySThread.Thread(InnaStart).Start();
    17. }
    18. private void InnaStart()
    19. {
    20. LoopCount += 1;
    21. Action();
    22. SySThread.Thread.Sleep(Delay);
    23. ThreadLoopEvent?.Invoke();
    24. }
    25. public void Stop() => ThreadLoopEvent = null;
    26. }


    Im Grunde, ja ich hab den Timer nachgebaut.

    Was es soll funktionieren ;D
    Es führt einfach ein Code in einem bestimmten Intervall aus.

    Nur hab ich momentan ein Problem.
    In einem Programm lande ich damit im StackOverFlow und bei dem anderen renne ich 4x (soweit hab ich getestet) den Uint durch ohne probleme :/
    Hi
    kommentiere mal deinen Code, vielleicht fällt es dir dadurch auf.
    Falls nicht, skizziere den Ablauf des Programms, indem du die Methodenaufrufe (Events sind auch Methodenaufrufe über Delegaten) herausstellst und welche Abhhängigkeit sich dort ergibt. Das sollte dich auf die Fährte des Stapelüberlaufs führen.

    Zu Stapelüberläufen an sich kommt es, wenn zu viele Methoden verschachtelt ausgeführt werden, d.h. z.B.
    A
    -A
    --A
    ---A
    ....
    --...-A

    wenn - darstellt, dass A aufgerufen wird, ohne das Ende von sich zu erreichen.

    Viele Grüße
    ~blaze~
    tja - ich weiss auch nicht. Ich find dein Code voll unübersichtlich - mit dem komischen ThreadloopEvent, was kein Event ist, und dem Selbst-Aufruf darüber etc...

    Warum - wenn du einen Loop haben willst - programmierst du nicht einfach eine Schleife (engl: "Loop")?

    C#-Quellcode

    1. public class ThreadLoop {
    2. private Action _Action;
    3. private int _Delay;
    4. private volatile bool _IsRunning;
    5. public uint LoopCount;
    6. public ThreadLoop(Action action, int delay = 0) {
    7. _Action = action;
    8. _Delay = delay;
    9. }
    10. public void Start() {
    11. _IsRunning = true;
    12. new SySThread.Thread(InnaStart).Start();
    13. }
    14. private void InnaStart() {
    15. while (_IsRunning) { // der "loop"
    16. LoopCount += 1;
    17. _Action();
    18. SySThread.Thread.Sleep(_Delay);
    19. }
    20. }
    21. public void Stop() { _IsRunning = false; }
    22. }
    ungetestet