Nic nie robiące pętle - odmulenie

0

Mam takie pytanie. Gdy tworze w programie pętle:

bool koniec = false;
while (!koniec)
{
  if (costam)
   {
    //rob costam
   }
}

i zmienna cośtam zmienia się na true na przykład w timerze, wątku (lub gdziekolwiek) to program ma zawsze maksymalne zużycie procesora na jednym rdzeniu a w zasadzie nic wtedy nie robi poza czekaniem na zmiane jednej zmiennej. Czy da się zablokować jakoś program na czas czekania tak żeby program korzystał z procesora tylko wtedy kiedy musi?</cpp>

0

sleep, lub semafor/muteks/cokolwiek innego z ipc + waitforsingleobject

0

Albo wstaw po prostu w timer to "rob costam"

0

ale chodzi o to że nawet jeśli wstawie w ten timer kod to i tak zostanie mi:
while (!koniec) {}
bo jak tego nie zostawie to mi się program wyłączy.. wrzuciłem Sleep(0) w kod, zużycie dalej równo 50%. w zasadzie robie to w allegro. nie wiem jak tam dostać się do komunikatow okna. w normalnym programie wysylalbym komunikaty a w allegro to sam nie wiem.. poczytam pozniej o muteksach i semaforach i dam znac jak mi idzie :)

0
krwq napisał(a)

w zasadzie robie to w allegro

I to jest główna pętla tak ? I to jest na zasadzie:

while(!koniec)
{
   odczytaj_klawisze();
   if (wybrano_wyjście()) koniec = true;
   rysuj_scene();
}

?

Jeśli tak, to możesz w ten sposób:

unsigned max_ticks_per_scene = 50;
unsigned last_tick = GetTickCount(); // czy jakaś podobna funkcja do mierzenie czasu, może jest w allegro
while(!koniec)
{
   //czekamy tyle czasu, aby prędkość pętli nie przekraczała max_ticks_per_scene na jedną iterację
   unsigned tick = GetTickCount();
   unsigned to_wait = min(max_ticks_per_scene, max_ticks_per_scene - tick + last_tick);
   last_tick = tick;
   sleep(to_wait); 

   odczytaj_klawisze();
   if (wybrano_wyjście()) koniec = true;
   rysuj_scene();
}

Jak co innego to opisz problem dokładniej.

0

dzięki bardzo :) w życiu bym na taki prosty pomysł nie wpadł :) zużycie procesora spadło do 0% :) zastanawia mnie tylko dlaczego czas 50ms był odczuwalny dla mojego oka :) zmniejszyłem maksymalny czas do 20 i już ok było :) ciekawi mnie też również ten zapis:
min(max_ticks_per_scene, max_ticks_per_scene - tick + last_tick)

wiemy że tick-last_tick>=0 zatem zakładając że dla pierwszego wykonania czas ten będzie zero, to później czas się ten utrzyma i może się okazać że wejdzie w liczby ujemne, a to spowoduje przejście int'a na drugą stronę i czekanie olbrzymiej ilości czasu (przed chwilą mi się to stało). zmieniłem ten zapis troszkę i już działa prawidłowo :)

dziękuje i pozdrawiam :)

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