Wykonywanie danej funkcji co 20ms

0

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..

1

Spróbuj coś w rodzaju:

int time;
while(true)
{
 time = GetTickCount();
 funkcja();
 time = GetTickCount()-time; // czas wykonywania funkcji
 Sleep(20-time);
}
0

Dzięki właśnie to samo mi podpowiedział ktoś inny :)

0

while(true) {
long start=DokladnyCzasDoMilisekund();
funkcja();
Sleep(max(20+start-DokladnyCzasDoMilisekund();0));
}

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ę...

0
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ę
  }
0

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);
0

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);
        }
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1