Cześć.
Potrzebuję aby pewna funkcja się wykonywała co 20 ms w nowym wątku. Wprawdzie mógł bym zrobić nowy wątek i wnim:
while(true) {
funkcja();
Sleep(20);
}
Ale wtedy funkcja by się wykonywała co 20ms+czas działania, z góry dzięki za pomoc..
Cześć.
Potrzebuję aby pewna funkcja się wykonywała co 20 ms w nowym wątku. Wprawdzie mógł bym zrobić nowy wątek i wnim:
while(true) {
funkcja();
Sleep(20);
}
Ale wtedy funkcja by się wykonywała co 20ms+czas działania, z góry dzięki za pomoc..
Spróbuj coś w rodzaju:
int time;
while(true)
{
time = GetTickCount();
funkcja();
time = GetTickCount()-time; // czas wykonywania funkcji
Sleep(20-time);
}
Dzięki właśnie to samo mi podpowiedział ktoś inny :)
while(true) {
long start=DokladnyCzasDoMilisekund();
funkcja();
Sleep(max(20+start-DokladnyCzasDoMilisekund();0));
}
Podane przez Was rozwiązanie jest bliskie, ale i tak stopniowo będzie się rozjeżdżać, np. nie nadaje się zrobienia zegara.
Pytanie precyzja którego elementu jest ważniejsza, odstęp między cyklami, czy ilość cykli na sekundę...
time_t gotime=GetTickCount();
while(true)
{
time_t now=GetTickCount();
if(gotime<=now)
{
funkcja();
gotime+=20;
}
sleep(max(1,3*(gotime-now)/4)); // możesz wziąć inną proporcję
}
nie lepiej wykorzystać timer?
np:
#include <time.h>
#include <signal.h>
void timer_20ms (int sig)
{
struct itimerval tout_val;
//przeladowanie timera
tout_val.it_interval.tv_sec = 0;
tout_val.it_interval.tv_usec = 0;
tout_val.it_value.tv_sec = 0;
tout_val.it_value.tv_usec = 20000;
setitimer(ITIMER_REAL, &tout_val,0);
signal(SIGALRM, timer_20ms);
//tu cialo twojej funkcji
//lub ja w tym miejscu wywolujesz
}
//uruchamiamy timer
struct itimerval tout_val;
tout_val.it_interval.tv_sec = 0;
tout_val.it_interval.tv_usec = 0;
tout_val.it_value.tv_sec = 0;
tout_val.it_value.tv_usec = 20000;
setitimer(ITIMER_REAL, &tout_val,0);
signal(SIGALRM, timer_20ms);
Dla mnie jest najważniejsza ilość cykli na sekundę. 50 w zupełności mi wystarczy czyli 0.02s == 20ms. Jak na razie mam tak:
void enemy()
{
int time;
while(true)
{
time = GetTickCount();
move_enemy();
while(true)
{
if ((GetTickCount()-time) >=20) break;
Sleep(0);
}
}
}