SetTimer() for delay

Posted on 1998-11-01
Medium Priority
Last Modified: 2013-12-26

   I want to write a delay function down to 1ms. Currently, I use SetTimer(timerId, timeout) to do this. Problem is, the timming seems correct only for "timeout > 100". Why is this happening, my code is like

class NewDialog: public TDialog

    int timenow;
    void EvTimer(uint);



    timenow = 0;

void NewDialog::SetupWindow()
    SetTimer(1, 1);

void NewDialog::EvTimer(uint)
    if(timenow++ == 1000)
        MessageBox("Time out");
        timenow = 0;

I compiled the code with Borland C++ 5.02.
The MessageBox takes > 10s to appear. What's wrong?
Or, is there any other ways to implement delay() under Win32?

Any help will be appreciated.

Question by:TanTT
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions

Accepted Solution

gatkinso earned 210 total points
ID: 1299800
The Windows SetTimer function only has a resolution of about 11 ms.  For a higher resolution timer, I would suggest using an MCI timer (harder to do, and I am only about 50% sure how to do it), or perhaps spawn a "Timer" thread in which you loop continuously, sending a message every millisecond:

void TimerThreadProc(LONG lParam) {
 while (bRunning) {
  Sleep(1);  //Sleep() has a resolution of 1 ms (so "they" say)

I hope that this is not a real time application (otherwise you wouldn't be running Windows :)  ), as this code will be off a few microseconds in either direction.

For the MCI method, search the documentation for info on the following fragment:

              MCI_SETTIMECODE,    //  <--- this is the key
              DWORD dwFlags,
              (DWORD) (LPMCI_GENERIC_PARMS) lpSetTimeCode);
LVL 14

Expert Comment

ID: 1299801
Yes, gatkinso right, must use Pause command, but
must pay attention to 2 punkts:
1. This works only in thread !!!
2. You can not use Timer, but make Loop in you thread
 and Pause. For more details see Petzold's Book
"Programming in Windows"
This is example from 14 chapter:(multi2)

void Thread1 (PVOID pvoid)
     PPARAMS pparams ;

     pparams = (PPARAMS) pvoid ;

     while (!pparams->bKill)
             .... //you code
     _endthread () ;
Regards, Alex


Author Comment

ID: 1299802
I checked the accuracy of Sleep() with following code:

   for(count = 0; count < 10000; count)

The messagebox took more than 20s to appear. Thus, it won't be accurate if I implement the code as stated.

The MCI part, however, I didn't test it since a lot of codes have to be modified.

My friend told me to use QueryPerformanceCounter() & QueryPerformanceFrequency() for high-resolution timer. The functions worked quite well. The messagebox took exactly 10s to appear on screen.

Thanks anyway.


Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction Since I wrote the original article about Handling Date and Time in PHP and MySQL several years ago, it seemed like now was a good time to update it for object-oriented PHP.  This article does that, replacing as much as possible the pr…
Originally, this post was published on Monitis Blog, you can check it here . In business circles, we sometimes hear that today is the “age of the customer.” And so it is. Thanks to the enormous advances over the past few years in consumer techno…
Viewers will learn about arithmetic and Boolean expressions in Java and the logical operators used to create Boolean expressions. We will cover the symbols used for arithmetic expressions and define each logical operator and how to use them in Boole…
Video by: Mark
This lesson goes over how to construct ordered and unordered lists and how to create hyperlinks.
Suggested Courses

764 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question