ghd
ghd

Reputation: 545

How to use same timer for different time intervals?

I am using a timer in my code. Status bar updates in tick event on clicking respective button for the time inteval mentioned in properties say one second. Now i want to use the same timer for a different time interval say two seconds for a different oepration. How to achieve that?

Upvotes: 5

Views: 6076

Answers (4)

toru
toru

Reputation: 1

Change the Interval property in every elapsed time. for example, this program process data 30 seconds and sleep 10 seconds.

static class Program
{
    private System.Timers.Timer _sleepTimer;
    private bool _isSleeping = false;
    private int _processTime;
    private int _noProcessTime;

    static void Main()
    {
        _processTime = 30000; //30 seconds
        _noProcessTime = 10000; //10 seconds

        this._sleepTimer = new System.Timers.Timer();

        this._sleepTimer.Interval = _processTime;
        this._sleepTimer.Elapsed += new System.Timers.ElapsedEventHandler(sleepTimer_Elapsed);

        ProcessTimer();

        this._sleepTimer.Start();
    }

    private void sleepTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        ProcessTimer();
    }

    private void ProcessTimer()
    {
        _sleepTimer.Enabled = false;

        _isSleeping = !_isSleeping;

        if (_isSleeping)
        {
            _sleepTimer.Interval = _processTime;

            //process data HERE on new thread;
        }
        else
        {
            _sleepTimer.Interval = _noProcessTime;
            //wait fired thread and sleep
            Task.WaitAll(this.Tasks.ToArray());
        }
        _sleepTimer.Enabled = true;
    }
}

Upvotes: 0

decyclone
decyclone

Reputation: 30820

I agree with @Henk and others.

But still, something like this could work:

Example

    Int32 counter = 0;

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (counter % 1 == 0)
        {
            OnOneSecond();
        }

        if (counter % 2 == 0)
        {
            OnTwoSecond();
        })

        counter++;
    }

Updated Example

private void Form_Load()
{
    timer1.Interval = 1000; // 1 second
    timer1.Start(); // This will raise Tick event after 1 second
    OnTick(); // So, call Tick event explicitly when we start timer
}

Int32 counter = 0;

private void timer1_Tick(object sender, EventArgs e)
{
    OnTick();
}

private void OnTick()
{
    if (counter % 1 == 0)
    {
        OnOneSecond();
    }

    if (counter % 2 == 0)
    {
        OnTwoSecond();
    }

    counter++;
}

Upvotes: 2

26071986
26071986

Reputation: 2330

Change timer Interval property.

Upvotes: 0

Mitch Wheat
Mitch Wheat

Reputation: 300489

Create a second timer. There is nothing to gain from hacking the first timer.

As @Henk noted, Timers are not that expensive. (Especially not compared to fixing hard to maintain code!)

Upvotes: 6

Related Questions