Solved

SetTimer() for delay

Posted on 1998-11-01
3
705 Views
Last Modified: 2013-12-26
Hi,

   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
this(simplified):


class NewDialog: public TDialog
{
public:
    NewDialog();
    ...
    ...

protected:
    int timenow;
    void EvTimer(uint);

    DECLARE_RESPONSE_TABLE(NewDialog);
};

DEFINE_RESPONSE_TABLE1(NewDialog, TDialog)
    EV_WM_TIMER,
END_RESPONSE_TABLE;

NewDialog::NewDialog()
{
    timenow = 0;
}

void NewDialog::SetupWindow()
{
    TDialog::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.

Thanks.
0
Comment
Question by:TanTT
3 Comments
 

Accepted Solution

by:
gatkinso earned 70 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)
  SendMessage(hTargetWnd,ID_YOURTIMEOUTMESSAGEID,lYourDataParam);
 }
}

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:

MCIERROR mciSendCommand(MCIDEVICEID wDeviceID,
              MCI_SETTIMECODE,    //  <--- this is the key
              DWORD dwFlags,
              (DWORD) (LPMCI_GENERIC_PARMS) lpSetTimeCode);
0
 
LVL 14

Expert Comment

by:AlexVirochovsky
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
              Pause(1);
          }
     _endthread () ;
     }
Regards, Alex

0
 

Author Comment

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

   for(count = 0; count < 10000; count)
      Sleep(1);
   MessageBox("Timeout");

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.

0

Featured Post

NAS Cloud Backup Strategies

This article explains backup scenarios when using network storage. We review the so-called “3-2-1 strategy” and summarize the methods you can use to send NAS data to the cloud

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
Collapseable list of URLs. 10 130
Element alignment and word wrapping 9 69
Windows Tool to Build Android and iOS App 3 77
Adjust the position 3 60
Article by: Matthew
I am a very big proponent of technology compliance standards and strive to meet such criteria in all of my work. That includes my site, which is 100% XHTML 1.0 compliant as determined by the World Wide Web Consortium. https://www.matthewstevenkel…
Preface This article introduces an authentication and authorization system for a website.  It is understood by the author and the project contributors that there is no such thing as a "one size fits all" system.  That being said, there is a certa…
Viewers will learn one way to get user input in Java. Introduce the Scanner object: Declare the variable that stores the user input: An example prompting the user for input: Methods you need to invoke in order to properly get  user input:
HTML5 has deprecated a few of the older ways of showing media as well as offering up a new way to create games and animations. Audio, video, and canvas are just a few of the adjustments made between XHTML and HTML5. As we learned in our last micr…

809 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