Solved

Real time on Windows 7

Posted on 2013-01-24
11
551 Views
Last Modified: 2013-01-25
Hi Experts,
I had a wireframe object and had a file describing how it moved in time.  I was using C++ with Win32 libraries and the wireframe was running in an OpenGL window.  The file described a smooth motion through time without any quick movements, and the code I wrote to do the movements worked well- most of the time.  It worked very simply- with a Sleep(milliseconds) between each movement.  Again, the transition was bang on most of the time.  But sometimes the Sleep calls appeared to not wait at all and the mesh moved in an explosive display of fast movements as if there were no wait.  So always the same input, the same code, but different iterations of the same program with different results.  So is the problem the Windows clock?  (are there known issues for things like this).  And if yes, would a timer with a callback been better for some reason?  Or is what I'm trying to do here not very easily achieved?

Thanks for any help!
Mike
0
Comment
Question by:thready
  • 6
  • 3
  • 2
11 Comments
 
LVL 1

Author Comment

by:thready
Comment Utility
So basically, the issue is, I have a series of discrete movements that need some time between them before changing location....
0
 
LVL 55

Expert Comment

by:Jaime Olivares
Comment Utility
Hi thready,
The sleep approach is not a common practice, considering that it won't ensure you an specific period, because the render time is added to that timespan.
On the other hand, the timer approach is used regularly for ensuring always the same timespan between each render.
An intermediate approach without a timer is to use a time variable to wait for the proper time to render inside a inner while loop. In pseudocode it would be something like:

p = period in miliseconds
t0 = current_time
do
{
      t1 = t0 + p  
      Render_your_scene()
      while (current_time < t1)
      {
           sleep(10)    // sleep a very small amount of time in milliseconds
      }
      t0 = t1
} while (!some_exit_condition)
0
 
LVL 1

Author Comment

by:thready
Comment Utility
Hi jaime- your code is the code that I am describing.  The sleep doesn't work (for the small amount of milliseconds), because I'm working with a medical device that runs at 60Hz- so the sleeps are often only about 4 milliseconds!  I'm wondering if the timer approach will work better because maybe it doesn't come from the same system clock as the sleep function uses?
0
 
LVL 86

Accepted Solution

by:
jkr earned 500 total points
Comment Utility
If you basically need a better timer resolution, multimedia timers might be what yo're looking for, see http://www.codeproject.com/Articles/1236/Timers-Tutorial
0
 
LVL 55

Expert Comment

by:Jaime Olivares
Comment Utility
in the code I have provided, it is not much meaningful the period of the sleep as far at it is slow, but the value of 'p'
the loop containing the sleep will be executed many times until the period 'p' is completed
0
IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 
LVL 1

Author Comment

by:thready
Comment Utility
ok so we could take p out of there basically- it's just a way to remove CPU starvation... Cool.
0
 
LVL 1

Author Comment

by:thready
Comment Utility
sorry- i meant take the sleep out of there.......  :-P
0
 
LVL 55

Expert Comment

by:Jaime Olivares
Comment Utility
if you remove that sleep, the CPU usage will raise to 100%
but I guess that is not a big deal in multi-core computers nowadays :)
0
 
LVL 1

Author Comment

by:thready
Comment Utility
I noticed from jkr's link that on Windows, you start getting into trouble with timers below 10ms.  I wonder how precise multimedia timers can get.
0
 
LVL 86

Expert Comment

by:jkr
Comment Utility
See yourself - http://msdn.microsoft.com/en-us/library/dd742877%28VS.85%29.aspx ("About Multimedia Timers"):

These timer services are useful for applications that demand high-resolution timing. For example, a MIDI sequencer requires a high-resolution timer because it must maintain the pace of MIDI events within a resolution of 1 millisecond.
0
 
LVL 1

Author Closing Comment

by:thready
Comment Utility
This was just what I was looking for!  Thank you!
0

Featured Post

Enabling OSINT in Activity Based Intelligence

Activity based intelligence (ABI) requires access to all available sources of data. Recorded Future allows analysts to observe structured data on the open, deep, and dark web.

Join & Write a Comment

When writing generic code, using template meta-programming techniques, it is sometimes useful to know if a type is convertible to another type. A good example of when this might be is if you are writing diagnostic instrumentation for code to generat…
Basic understanding on "OO- Object Orientation" is needed for designing a logical solution to solve a problem. Basic OOAD is a prerequisite for a coder to ensure that they follow the basic design of OO. This would help developers to understand the b…
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use nested-loops in the C programming language.
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.

762 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

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now