Was macht timer.Start() genau?



  • Also wenn ich die MSDN richtig lese, dann bewirkt Start() folgendes:

    timer.Enabled wird auf true gesetzt
    Elapsed-Event wird ausgelösst.

    Aber warum ver***** nochmal macht er das nicht bei mir.

    ich hab das Delegate bestimmt, das Interval ist gesetzt.

    Er setzt auch den timer auf enabled, aber er löst nicht das Ereignis aus, hat da jemand ne Ahnung warum???



  • Hi,

    kannst du mal den Code posten wie du es gemacht hast?

    Gruß
    NCC



  • System.Timer.Timers timer = new System.Timer.Timers(1000);
    timer.Elapsed += ElapsedEventHandler(foo);
    timer.Start();
    


  • Also bei mir funktionierts kannst du mal die Funktion foo posten was du da machst?

    Ich habs so gemacht:

    private void button1_Click(object sender, EventArgs e)
    {
    	System.Timers.Timer timer = new System.Timers.Timer(1000);
    	timer.Elapsed += new System.Timers.ElapsedEventHandler(OnElapsed);
    	timer.Start();
    }
    
    void OnElapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
    	if (textBox1.InvokeRequired)
    	{
    		System.Timers.ElapsedEventHandler callback = new System.Timers.ElapsedEventHandler(OnElapsed);
    		this.Invoke(callback, sender, e);
    	}
    	else
    	{
    		textBox1.Text += e.SignalTime.ToString() + Environment.NewLine;
    	}
    }
    


  • Ist jetzt zwar nur von einem Testprogramm, aber da ging´s auch nicht:

    private void timer_Elapsed( object sender, ElapsedEventArgs e)
    {
        if( this.InvokeRequired )
        {
            this.BebinInvoke(new ElapsedEventHandler(timer_Elapsed), new object[] { sender, e });
        }
        else
        {
            this.label.Text = count.ToString();
            this.count++;
        }
    }
    

    Der Timer wird zwar gestartet, aber das Ereignis wird nicht sofort ausgelösst, sondern erst wenn der Timer abgelaufen ist.

    Mittlerweile hab ich mir selbst eine Timer-Klasse geschrieben die eben von Timer erbt und hab die Start-Funktion überschrieben, das sie gleich beim Start das Event auslöst



  • Der Sinn eines Timers ist, ein Ereignis nach einer gewissen Zeit auszulösen und nicht beim Start. Da rufe ich eine Methode direkt auf.

    Was fürn Sinn macht ein Timer der erst in Event auslöst, dann eine Zeit ablaufen lässt und dann nichts tut 😕

    EDIT:
    "Elapsed" heisst übrigens "verstrichen" (im zeitlichen Sinn)



  • Ja schon klar, das soll er auch machen, ab wenn ich ihn starte soll er halt gleich mal ein Event auslösen.
    Ich will nicht erst wer weiss wie lange warten, bis zum 1. mal auf der Anzeige überhaupt was zu sehen ist. deswegen soll beim start auch gleich das Event ausgelöst werden.



  • ja dann mach es doch wie LordJaxom gesagt hat und rufe beim Auslösen des Timers deine Funktion auf, die dir den Timer zu Anzeige bringt



  • Also aus OO-Sicht ist es sicher der Königsweg sich eine eigene Klasse zu machen die das Verhalten was man haben möchte abbildet, anstatt bei jedem Mal gemeinsam mit Start() eine weitere Methode aufzurufen (was man ja auch mal vergessen kann 😉 )



  • Jep, und da ich sehr vergesslich bin 😉 hab ich mich dann eben für diesen Weg entschieden.

    Aber wenn ich die MSDN richtig gelesen habe, dann sollte doch die Funktion Start eigentlich genau dieses Verhalten haben, oder???



  • Tequilla schrieb:

    Aber wenn ich die MSDN richtig gelesen habe, dann sollte doch die Funktion Start eigentlich genau dieses Verhalten haben, oder???

    Wo soll den das stehen? Also in meiner MSDN finde ich nix...

    Also mit persönlich wäre das zu umständlich da jetzt eine neue Klasse abzuleiten und halt der restlichen Schmutz der damit verbunden ist. Setz doch beim ersten mal den Timer auf 1 dann kommt das Event sofort. Wenn das Event eingetroffen ist, dann setzte den Timer auf den gewünschten Wert. Ist ein Work-Around aber was soll. Warum sich das Leben unnötig kompliziert machen. 😃



  • Och das sind nur wenige Codezeilen, und wenn man es einmal gemacht hat, kann man ja die Klasse immer wieder rinbinden, wird schliesslich nicht das letzte mal sein, das ich das brauche.



  • Wärste vieleicht so freundlich und würdest hier den Code posten von der neuen Timer Klasse? Würde mir das mal gerne anschauen. 🕶



  • Aber nur weil du es bist 😉

    using System;
    using System.Timers;
    
    namespace MyControl
    {
    	/// <summary>
    	/// Eigener Timer mit funktionierendem Start()
    	/// </summary>
    	public class Timer : System.Timers.Timer
    	{
    		public new event ElapsedEventHandler StartElapsed;
    
    		/// <summary>
    		/// CTOR
    		/// </summary>
    		/// <param name="Interval">Interval in Millisekunden</param>
    		public Timer( double Interval ) : base( Interval )
    		{
    			this.Elapsed += new ElapsedEventHandler(Timer_Elapsed);
    		}
    
    		/// <summary>
    		/// Umbiegen des Events auf "StartElapsed"
    		/// </summary>
    		/// <param name="sender">Systemvariable</param>
    		/// <param name="e">Systemvariable</param>
    		private void Timer_Elapsed(object sender, ElapsedEventArgs e)
    		{
    			OnElapsed(e);
    		}
    
    		/// <summary>
    		/// Setzt den Timer auf Enabled und löst das Ereignis "StartElapsed" aus
    		/// </summary>
    		public new void Start()
    		{
    			this.Enabled = true;
    			OnElapsed(null);
    		}
    
    		/// <summary>
    		/// Setzt den Timer auf Enabled und löst abhängig von "RaiseEvent" das Ereignis "StartElapsed" aus
    		/// </summary>
    		/// <param name="RaiseEvent">
    		/// Gibt an, ob das Ereignis auch dann ausgelöst werden soll, wenn der Timer bereits gestartet ist.
    		/// true: Ereignis wird ausgelöst
    		/// false: Ereigins wird nur ausgelöst, wenn der Timer nicht gestartet war
    		/// </param>
    		public new void Start(bool RaiseEvent)
    		{
    			if (!RaiseEvent && this.Enabled)
    			{
    				return;
    			}
    			this.Enabled = true;
    			OnElapsed(null);
    		}
    
    		/// <summary>
    		/// Event auslösen
    		/// </summary>
    		/// <param name="e">Systemvariable</param>
    		protected void OnElapsed(ElapsedEventArgs e)
    		{
    			if (StartElapsed != null)
    			{
    				StartElapsed(this, e);
    			}
    		}
    	}
    }
    

    Man muss halt jetzt auf das Ereignis StartElapsed reagieren



  • thx


Log in to reply