ciklus

 ( TJ | 2010. szeptember 22., szerda - 15:57 )

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ás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

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$%#$#%^*^"

Igen, sajnos ezt kezdtem sejteni a találatok alapján...

A nanosleepet próbálom most, csak attól félek, hogy ez nem lesz alkalmas komolyabb grafikus megjelenítésre.

csak tipp:hasznald a timer-t erre

Próbáltam rákeresni, de nem találtam semmit. Tudsz adni linket?

man setitimer de van meg masfele is. Gugli: linux timer

Hát a nanosleep biztosan nem fog kirajzolni semmit a képernyődre...

azert azt a platformot megneznem, ahol nincs posix sleep() de van c/c++ fordito ;-)

Windows..? :^)

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

a windows eleg regota posix

Wikipediarol:

Starting with Windows XP, the POSIX subsystem is not included as part of standard Windows distributions and has been replaced by Interix.

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

"amugy meg ahol van tcp/ip, ott altalaban van select() is es azzal lehet aludni."
Es milyen az agyban? :-)
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant.

Alvásnál tök mindegy, csak ne rugdosson.

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.

Igen, azt hiszem ez a játékos dolog kell. Tehát akkor eseményekre lesz szükségem? Ez akkor valóban operációs rendszer függő kód lesz? Hol tudnék ennek bővebben utánanézni, mire lesz szükségem ehhez?

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 Qt-t már letöltöttem egy hónapja, csak nem tudtam megérteni -mivel még itt nem tartok-, hogyan kell külső könyvtárként meghívni, hogy a licenceléssel ne legyen gond.

Ezt nem teljesen értem. Letöltöd a nokiától a Qt SDK LGPL-es verzióját, aztán simán kreálsz vele akár kereskedelmi alkalmazást. Emlékeim szerint van benne egy csomó példaprogram 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. :)

Szerintem erről lehet szó :) Ez mit is jelent?

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?

//#include < sched.h >
#include < unistd.h >

int main(int argc, char **argv)
{
        for(;;) {
                usleep(1);
//              sched_yield();
        }
}

___
info

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

Inkább az SDL-t javasolnám. A glut eléggé limitált.

Csak mivel az elodason azt oktatjak, es a hazinak is az a kovetelmenye, igy nem fog mast tanulni, max mellette. A prioritasban a glut az elso jelen pillanatban.
___
info

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