[System.Windows.Froms.Timer über Event starten ->Ticks werden nicht ausgeführt]



  • Hi,
    ich sehe gerade Wald vor lauter Bäumen nicht und
    weiß nicht was ich falsch mache, vielleicht hat ja
    einer ein Tipp.
    Ich verwende eine Klasse
    um diverse Daten zu halten die ein event deklariert:

    Class Foo
    {
      //...
      public event startTimerEventHandler startTimerEvent; 
      //...
    }
    //...
    public delegate void startTimerEventHandler(object sender,EventArgs args);
    //...
    

    beim erzeugen der Foo-Objekte in meinen Windoes.Form
    weiße ich den Event folgende funktion zu

    //...
    FooObj.startTimerEvent +=
                  new startTimerEventHandler(this.eventStartTimer);
    //...
    

    in der eventStartTimer() Funktion setze ich einfach mein mein Timer
    Objekt auf enabled

    mTimer.Enabled = true;
    

    Das TimerObj initialisiere ich in Konstruktor
    meines Form-Klasse:

    mTimer = new System.Windows.Forms.Timer();
            mTimer.Enabled = false;
            mTimer.Interval = 2500;
            mTimer.Tick += new System.EventHandler(this.eventTimerTick);
    

    Wenn ich jetzt den Event aus der FooKlasse anschiebe
    wird zwar der Timer auf Enabled gestellt, mit den
    Debugger sehe ich, dass er den Code auch ausführt wird, allerdings
    wird die Tick-Funktion nie ausgeführt.
    Wenn ich allerdings den Timer gleich im Konstruktor auf
    enabled stell in meinen Forms-Klasse, dann wird der Tick brav
    ausgeführt.
    Hat einer eine Idee was ich falsch mache?
    Viele Grüße



  • ok hab es jetzt doch gefunden 😃
    Anscheinend war ich nicht ganz Threadsicher und in einen anderen
    Thread unterwegs hab es jetzt so gelöst:

    private void eventStartTimer(object sender, EventArgs e)
        {
          startTimer();
        }
    
     private void startTimer()
        {
          if (this.InvokeRequired)
            this.Invoke(new MethodInvoker(this.startTimer));
          else
          {
            initializeTimer();
            if (!mTimer.Enabled)
            {
              mTimer.Enabled = true;        
            }
          }
    
        }
    

    jetzt rennt er 😃



  • Wenn du jedoch unabhängig von der zugrunde liegenden API, ob nun Forms oder WPF, einen Timer starten willst, nimm dazu lieber System.Threading.Timer. Dann brauchst du keine Nachrichtensschleife wie beim Forms-Timer


Anmelden zum Antworten