?
Solved

while loop to run every second?

Posted on 2003-02-21
11
Medium Priority
?
684 Views
Last Modified: 2010-05-18
Ive been looking for a small snipet of a while loop which will run every second. Ive looked at so many clock()s, CLOCKS_PER_SECs, ticks, sleep()s and delay()s that im going crazy!

I dont want to use sleep or delay. I just want a while loop that will repeat itself once every second. I dont want the while loop to run infinately and be delayed for one second every time, i want it to *only be executed once per second*

TIA
0
Comment
Question by:Mamady
[X]
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
11 Comments
 

Author Comment

by:Mamady
ID: 7997713
accuracy is not important, i just need it to run at least once every second... if it might be a bit off, i can set it to run once every 900ms
0
 

Accepted Solution

by:
prinx earned 90 total points
ID: 7997727
i don't know how u can run it once every sec
but u can

while (1) {
if currenttime - lasttime >= 1 sec {
do once per sec stuff
}
}
0
 

Author Comment

by:Mamady
ID: 7997760
accuracy is not important, i just need it to run at least once every second... if it might be a bit off, i can set it to run once every 900ms
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:Mamady
ID: 7997771
yeah, the problem with that is that the while loop is running infinately, which is what i dont want.

also, i dont know how to get currenttime and lasttime, otherwise i could use the if condition as the while condition.
0
 

Author Comment

by:Mamady
ID: 7997809
yeah, the problem with that is that the while loop is running infinately, which is what i dont want.

also, i dont know how to get currenttime and lasttime, otherwise i could use the if condition as the while condition.
0
 
LVL 7

Expert Comment

by:burcarpat
ID: 7997913
would you be interested in using threads for this purpose?
0
 

Expert Comment

by:raffael
ID: 7998178
Hello,
what's the problem about using sleep(1000) within a thread?
0
 

Author Comment

by:Mamady
ID: 7998221
actually, i just fixed it using SetTimer()... im not sure who the points should go to, so ill just pass it on to the first guy.
0
 
LVL 12

Expert Comment

by:Salte
ID: 7998268
You don't want the loop to run for infinity you say?

So what is the condition for it to stop? At what time have you counted enough seconds so that you will stop counting seconds?

If you don't want it to stop but just go on, then you DO want an infinite loop.

Appears to me that you don't really know what you want.

Also, you can't write code in a regular OS such as Unix and Windows that is guaranteed to run once every second. Multitasking prevents such guarantees. If you run a real time OS for a dedicated application you can have such guarantees and in that case the loop is simple:

int next_time = current_time() + ONE_SECOND;
while (! stop_looping) {
   do_the_job();
   int time = current_time();
   while (time < next_time)
      time = current_time();
   next_time += ONE_SECOND;
}

This code assume you are the only program that runs on the computer. If you have other applications running you need multi-tasking and guarantees are going bye bye. It also assumes that the timer tick is an interrupt that will intercept your code and update the timer every now and then but that intercept is less than a second so it won't interfere with your timing.

This code will then execute once every second.

If you run Unix, Linux, WIndows or anything like that there CANNOT be any guarantees. There are other applications that run and there is no guarantee that your application will run once every second.

However, you can make it run so that in n seconds it will run approximately n times.

The approximately means that if your application is unable to run so that in one second it won't run, it wil run twice during the next second or so so that over n seconds it will be approximately n times.

You SHOULD use sleep for this case. The reason is simple, there's no point to have an application run around doing nothing just waiting for a condition to occur when many other applications could be running in the mean time.

If you run under windows it is even more important since if you have other windows up and running you probably do want to serve those windows (open menues, resize a window, close a window, move a window etc) while you're waiting and so you cannot run in a loop waiting for the time to be one second later. This is why you MUST use a timer in windows.

In windows create a timer and set it to send your application a message once every second. Then handle that mesasge.

If not in windows you can also use a timer but you can also use sleep. I will suggest you do not use sleep() but you use select() or usleep() instead. sleep() specify the time in seconds and sleep(1) is probably not so accurate, if your processing takes 10 ms to process you will get 1 second + 10ms between each time you do something instead of 1 second.

Use sleep like this:

struct timeval tv = { 0, 0 }; // waiting time.

// get time in millisecond resolution or better.
int next_time = current_time() + ONE_SECOND;

while (! stop) {
    do_the_job();
    int cur_time = current_time();
    tv.tv_usec = next_time - cur_time;
    next_time += ONE_SECOND;
    select(NULL,NULL,NULL,& tv);
}

This will do the job once every second and repeat.

How you can go aroudn and do a job once every second and never stop and manage that without an infinite loop is beyond me. That is simply impossible. You might think it is possible because a timer and handler doesn't have a loop but the message loop that windows uses is very much a loop and that is the loop you're using in that case. So what you're asking is impossible so I tried to give you a solution which although isn't what you asked for is probably what you want.

1. If windows application use a timer and a handler for that timer message.

2. If not windows you can use an alarm and then have your main program go in loop and sleep while the alarm wakes up once every second and do the job. Your program must still go in a loop and if you don't want to stop it that loop will be infinite. However, the loop doesn't do anything. One drawback with this approeach is that the alarm is an interrupt routine and therefore is limited to what it can do. If you want to do anything beyond the very basic, for example if you want to read a file, write a file (including keyboard and screen) you can't do that in the alarm handler but must set a flag so that the main loop can do the job instead. Essentialy you are back to the sleep() case as shown above and therefore the while loop I showed with select() IS the safest alternative if you're not running in windows.

However, you didn't even bother to tell us what platform and what kind of program (windows or not windows) you're writing so that leaves us making wild guesses. Also, since what you ask for is impossible that guessing becomes even wilder.

However, I tried to make a good guess and hope this is of help for you.

Alf
0
 
LVL 12

Expert Comment

by:Salte
ID: 7998275
Be aware that the solution you accepted will only run in certain applications. Windows will handle that very badly if you do such code in the main thread. Creating a subthread and do such a while loop there might work but you will see the program will hog the computer and waste CPU power. Your computer will run VEEERRRRRY  S L O W L .....Y

You selected a very bad solution as your accepted answer.

Alf
0
 

Author Comment

by:Mamady
ID: 7999978
like i said, i figured it out myself... the answer i 'accepted' is not the solution i used.

I just used SetTimer() to trigger the event once every second.

Also, Salte with regard to the 'infinate while loop', i guess i just meant that i only what while loop to execute once every second, rather than it always being true. But thanks for all the extra info... i found it very useful :)
0

Featured Post

New feature and membership benefit!

New feature! Upgrade and increase expert visibility of your issues with Priority Questions.

Question has a verified solution.

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

What is C++ STL?: STL stands for Standard Template Library and is a part of standard C++ libraries. It contains many useful data structures (containers) and algorithms, which can spare you a lot of the time. Today we will look at the STL Vector. …
IntroductionThis article is the second in a three part article series on the Visual Studio 2008 Debugger.  It provides tips in setting and using breakpoints. If not familiar with this debugger, you can find a basic introduction in the EE article loc…
The viewer will be introduced to the technique of using vectors in C++. The video will cover how to define a vector, store values in the vector and retrieve data from the values stored in the vector.
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.
Suggested Courses

777 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