ciklus

Fórumok

Sziasztok!

Biztos vagyok benne, hogy ezt a kérdést már máshol is feltették. Próbáltam rákeresni, de nem sok értelmes választ találtam vagy nem értettem meg.

C++-szal most kezdtem el barátkozni. Egy végtelen ciklust szeretnék létrehozni, ami nem járatja a processzort üresen (mint egy while ciklus). A cél az lenne, hogy a későbbiekben képes legyen kirajzolni valamit a képernyőre (pl. mozgó kör), anélkül, hogy ez az egyszerű feladat, minden erőforrást felhasználna és folyamatos maradna ennek ellenére.

köszi

Hozzászólások

Standard C/C++ megoldas erre nincs, hasznalhatod a POSIX sleep()-et, ha nincs, akkor nezz korul a platformod dokumentaciojaban!

----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"

hat ez igy eleg fura allitas, van ugyan teljesen korrekt posix alrendszer, de azt nem szokas mixelni a nativ api-kkal

de termeszetesen win32 platformon is van ra fuggveny: http://msdn.microsoft.com/en-us/library/ms686298(VS.85).aspx

amugy meg ahol van tcp/ip, ott altalaban van select() is es azzal lehet aludni.

--
NetBSD - Simplicity is prerequisite for reliability

visszakerdezek

esemenyre szeretnel varni (hogy a program csinaljon valamit, ha kivol tortenik valami) de nem akarsz az esemenyre minden cpu-t felhasznalva varni. Ugye?

A vegtelen "ciklusban varunk egy allapotra" neve 'busy wait' es kerulni illik a programozaskor.

erre mindig van megoldas, attol fuggoen, hogy milyen esemenyre akarsz varni. Masik programra, arra, hogy a networkon megjelenjen valami vagy egyeb.

A problema nem nyelvfuggo. majdnem minden programozasi nyelven lehet oldani a problemat, de ez igy altalanosan tul szerteagazo. Az a lenyeg, hogy mi az a esemeny/dolog, amitol a varakozas abbamarad, es a programod elkezd dolgozni (pl kirajzol egy kort).

A kerdesed ertelmezheto ugy is, hogy egy folyamatos szamolast/tevekenyseget (kor animalasa a kepernyon) hogyan lehet valami CPU% ala beszoritani. Erre is lehet megoldas, alapvetoen mas, mint az elzo ertelmezesre adott megoldas.

Alapvetően grafikus megjelenítésre gondoltam. Legközelebbi hasonlat valami játék lenne. Számolás és rajzolás. Nem terhelné le teljesen a cpu-t, de szépen kirajzolná.

És akkor második körben jönne egy esemény (pl. a billentyűzet) figyelése, de az első probléma most fontosabb...

miert ne terhelje le a cpu-t?

ez egy elegge fontos kerdes.
Ha valamit ki akarsz szamolni, az valamekkora szamitasi igennyel jar, es vegul is mindegy, hogy 10 masodperc alatt 10%-ot eszik a cpu-bol, vagy 1 masodperc alatt 100%-ot.

Ha barmennyi cpu-t kepes lenne elvinni a program, de az a cel, hogy az oprendszerben mas programok tudjanak mukodni, akkor a program prioritasat le kell venni. Ha az a cel, hogy a cpu ne fogyasszon sokat, akkor kisebb cpu-t kell venni. ;-)

Jatekoknal igeny szokott az lenni, hogy a kepernyon megjeleno rajzolas ritmusra tortenjen (ne legyen se tul gyors, se tul lassu). Ezt is azzal a koncepcioval lehet elkepzelni/megfogni, hogy a program esemenyre dolgozik, nem ciklusban, nem magatol, hanem ha jon esemeny, akkor dolgozik. Megpedig ido-esemenyre, ker masodpercenkent 100 ido-esemenyt, es mindegyikre kirajzolja, amit kell.

Az esemenyek kezelese altalaban az oprendszer feladata, tehat nem c/c++ belso trukkoket kell nezni, hanem az adott oprendszer funkcionalitasat kell c/c++ -bol elerni. Ez mondjuk kezdo programozokent annyira nem latszik, hogy mi tartozik a nyelvhez, es mi a kornyezethez.

Hát ISO C++-ban eleve semmit sem tudsz kirajzolni, hiszen a C++-nak nincs grafikai támogatása. Ezért aztán két eset lehetséges: vagy az adott oprendszer API-ja támogatja az ilyesmit közvetlenül, ilyenkor azt az API-t kell megnézned (ekkor a programod nem lesz hordozható), vagy egy grafikát támogató keretrendszert kell használnod (Qt, GTK /van C++ binding hozzá gtkmm néven/, WxWidgets), ekkor meg a keretrendszer API-ját használod, és a programod annyira lesz hordozható, amennyire az adott keretrendszer. Utóbbi esetben eleve megoldott a thread- és eseménykezelés is.

A programod forráskódját ugyanúgy kell megírnod, az nem függ attól, hogy hogyan linkeled később a külső library-kat. A linkelés módját csak az határozza meg, hogy milyen paraméterekkel hívod meg a fordítóprogramot. Pl. gcc esetében alapból mindig dinamikus linkelést próbál, ha statikusat akarsz, akkor azt külön paraméterrel vagy a statikus object fájl(ok) megfelelő módon történő megadásával kell jelezned.
Most így hirtelen elbizonytalanítottál, hogy tudod-e már mi az a static ill. dynamic linking, és mik a technikai részletek - remélem nem értettelek félre nagyon. :)

Jatekoknal az a masik eset, hogy csakazertis 100%-on porgeti a procit. Mielott kirajzolna a kepernyore egy frame-et, megnezi az idot, es letarolja. Aztan rajzol. Rajzolas utan megnezi, hogy mennyi ido telt el, es annak megfeleloen modositja a jatek belso allapotat.
Szoval egy gyorsabb gepen is 100% procit fog enni a jatek (egy magon), meg egy lassabb gepen is, de - az idofigyeles miatt - ugyanolyan gyorsan fognak mozogni benne a dolgok, csak a gyorsabbikon ketszerannyi FPS-el fog futni (kevesbe szaggat).

Jo, tudom, hogy ott a videokartya szamit, de nagyvonalakban igy megy. Igazabol ha gyors a procid, akkor o fog varni a videokartyara, es azalatt lesz ideje masra is (szoval nem 100%-on hajtja). Bonyolultabb esetben atveheti egy masik szal (procimag) a fizikat, megint masik a mesterseges intelligenciat, stb.

--
Always remember - correlation does not imply causation.
Since realising this, my life has been so much better.

Nos, de konkrétan mivel tudnám megvalósítani? Keressek rá arra, hogy POSIX event? Vagy Qt event?

ha majd úgyis rajzolnál vele, akkor opengl+glut, és glutMainLoop(); de csak mert most tanulom ;)

Mára elrakom magam. Holnap áttanulmányozok mindent, addig is köszi mindenkinek!