timer control

S

Steve

I am working on a emulator and need to have time based events. I've tried
to use the timer control and discovered that it runs waaaaaaay slow. I set
the tick frequency to 1, then in the tick event I update a label on my form,
nothing else. just counting in my head I have determined that it take
roughly 14 seconds to get through 1000 ticks or 1 second of the timer.

This really surprises me. I haven't even done any processing yet and the
thing is already slow. Is this typical of this control?

If I wanted to have a loop with time based execution, what is the
appropriate method? This is a windows form app and the emulator is running
in a dialog.

Thanks for any suggestions,
Steve
 
S

Steven Nagy

Howdy,

I would skip the windows API because you are going to get that slowness
running in a dialog.
I've noticed that nothing under 20ms in a timer is really accurate
either.

Maybe directX would be better for an emulator?

Otherwise, why not just put your code in a while loop with a sleep
statement?

Steven Nagy
 
W

Willy Denoyette [MVP]

Steve said:
I am working on a emulator and need to have time based events. I've tried
to use the timer control and discovered that it runs waaaaaaay slow. I set
the tick frequency to 1, then in the tick event I update a label on my
form, nothing else. just counting in my head I have determined that it
take roughly 14 seconds to get through 1000 ticks or 1 second of the timer.

This really surprises me. I haven't even done any processing yet and the
thing is already slow. Is this typical of this control?

If I wanted to have a loop with time based execution, what is the
appropriate method? This is a windows form app and the emulator is
running in a dialog.

Thanks for any suggestions,
Steve

No, it doesn't run way slow, the timer interval can't be less than the (HW)
system clock resolution. Some systems have a 10 msec. system clock
resolution while others may have something like 15 msec. That means that a
timer will need at least 10 (or 15) seconds to fire 1000 times. Note that I
said at least, Windows is not a real time OS, so there is no guarantee that
your timer event handler will be called at the exact time the timer fires,
the call may get delayed some undefined time depending on the current
activity of the system
The same goes for Thread.Sleep(n), don't expect that Sleep(2) will put the
thread asleep for 2 msec., no, it will sleep for at least 10 msec.

Willy.
 
S

Steve

Willy Denoyette said:
No, it doesn't run way slow, the timer interval can't be less than the
(HW) system clock resolution. Some systems have a 10 msec. system clock
resolution while others may have something like 15 msec. That means that a
timer will need at least 10 (or 15) seconds to fire 1000 times. Note that
I said at least, Windows is not a real time OS, so there is no guarantee
that your timer event handler will be called at the exact time the timer
fires, the call may get delayed some undefined time depending on the
current activity of the system
The same goes for Thread.Sleep(n), don't expect that Sleep(2) will put the
thread asleep for 2 msec., no, it will sleep for at least 10 msec.

Willy.

Willy, this makes perfect sense, thanks for the thorough explanation. It
does leave me still with a question, if I don't want to use DirectX like
Steven suggested, how do I implement a time controlled loop?

If the system time has a 10ms resolution (or 15 or whatever), then I can't
count on using that to determine elapsed time. I've never had to do this
before... If yo uhave any suggestions, I would really appreciate them.

Thanks again,
Steve
 
S

Steve

Steven Nagy said:
Howdy,

I would skip the windows API because you are going to get that slowness
running in a dialog.
I've noticed that nothing under 20ms in a timer is really accurate
either.

Maybe directX would be better for an emulator?

Otherwise, why not just put your code in a while loop with a sleep
statement?

Steven Nagy

Hi,

Thanks for the suggestion. DirectX would be over kill for this and I also
need to use WinForms for the UI. The sleep statement was interesting, but
then I read Willys post where he says it suffers from the same time
resolution as the timer control.

Thanks again,
Steve
 
W

Willy Denoyette [MVP]

Steve said:
Willy, this makes perfect sense, thanks for the thorough explanation. It
does leave me still with a question, if I don't want to use DirectX like
Steven suggested, how do I implement a time controlled loop?

If the system time has a 10ms resolution (or 15 or whatever), then I can't
count on using that to determine elapsed time. I've never had to do this
before... If yo uhave any suggestions, I would really appreciate them.

Thanks again,
Steve

Steve,
If you need to fire a timer at an interval that is smaller than say 20 msec.
you are stuck, even DirectX can't help you with that. Could you please
explain what exactly you want to achieve.

Willy.
 
S

Steve

Willy Denoyette said:
Steve,
If you need to fire a timer at an interval that is smaller than say 20
msec. you are stuck, even DirectX can't help you with that. Could you
please explain what exactly you want to achieve.

Willy.


I'm trying to make a very basic emulator for an embedded device. In
emulating the UI, there are different durations at which things happen.
When I designed the application in my head and on paper, processing tasks
evey millisecond was the cleanest way. I can make it work good enough with
100 ms intervals, I will just have some slight inaccuracies, this is just a
UI emulator, so it's not critical.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top