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
- 1694 megtekintés
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$%#$#%^*^"
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
csak tipp:hasznald a timer-t erre
- A hozzászóláshoz be kell jelentkezni
Próbáltam rákeresni, de nem találtam semmit. Tudsz adni linket?
- A hozzászóláshoz be kell jelentkezni
man setitimer de van meg masfele is. Gugli: linux timer
- A hozzászóláshoz be kell jelentkezni
Hát a nanosleep biztosan nem fog kirajzolni semmit a képernyődre...
- A hozzászóláshoz be kell jelentkezni
azert azt a platformot megneznem, ahol nincs posix sleep() de van c/c++ fordito ;-)
- A hozzászóláshoz be kell jelentkezni
Windows..? :^)
----------------------
"ONE OF THESE DAYS I'M GOING TO CUT YOU INTO LITTLE PIECES!!!$E$%#$#%^*^"
- A hozzászóláshoz be kell jelentkezni
a windows eleg regota posix
- A hozzászóláshoz be kell jelentkezni
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$%#$#%^*^"
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
"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.
- A hozzászóláshoz be kell jelentkezni
Alvásnál tök mindegy, csak ne rugdosson.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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...
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
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. :)
- A hozzászóláshoz be kell jelentkezni
Szerintem erről lehet szó :) Ez mit is jelent?
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Nos, de konkrétan mivel tudnám megvalósítani? Keressek rá arra, hogy POSIX event? Vagy Qt event?
- A hozzászóláshoz be kell jelentkezni
//#include < sched.h >
#include < unistd.h >
int main(int argc, char **argv)
{
for(;;) {
usleep(1);
// sched_yield();
}
}
___
info
- A hozzászóláshoz be kell jelentkezni
ha majd úgyis rajzolnál vele, akkor opengl+glut, és glutMainLoop(); de csak mert most tanulom ;)
- A hozzászóláshoz be kell jelentkezni
Inkább az SDL-t javasolnám. A glut eléggé limitált.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Mára elrakom magam. Holnap áttanulmányozok mindent, addig is köszi mindenkinek!
- A hozzászóláshoz be kell jelentkezni