Co se stane s cyklem, když zevnitř zavolám metodu jej obsahující? – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Co se stane s cyklem, když zevnitř zavolám metodu jej obsahující? – .NET – Fórum – Programujte.comCo se stane s cyklem, když zevnitř zavolám metodu jej obsahující? – .NET – Fórum – Programujte.com

 

Matěj Andrle+1
Grafoman
23. 1. 2015   #1
-
0
-

Dobrý den,
zprvu mne nenapadlo nic řešit. Pak si říkám - není to vlastně rekurze? V metodě s cyklem uvnitř cyklu tuto metodu volám k opakování celého procesu od píky. Je to nevhodná konstrukce? Co se stane se zbytkem cyklu?

void NewGame
initializace proměnných
cyklus
podmíněné volání NewGame z jiné metody
další logika - zatím ji ani nijak nesabotuji - ještě dojede i po „rekurzi“

Sabotovat logiku pod možným voláním? Nějak to rozdělovat? Anebo nechat být? Koukal jsem na RAM, zkoušel asi minutu držet tlačítko pro novou hru - nic se nepokazilo, nároky se nezvýšily atd. Tak co se vlastně děje?
Děkuji.

Nahlásit jako SPAM
IP: 78.136.188.–
KIIV
~ Moderátor
+43
God of flame
23. 1. 2015   #2
-
0
-

Zni to jako prisernej navrh, kdyz neumis ukoncit predchozi hru a zacinas dalsi..

Co se stane s cyklem? Nic se s nim nestane, dokud bezi vnorene rekurze, tak ceka na svoji prilezitost. A kdyz se z tech rekurzi vratis, pokracuje tam, kde skoncil (coz kdo vi jestli nekdy udelas).

Kazda rekurze zabere par veci jako zalohy registru, kam se ma vratit, predane parametry, lokalni parametry... Pokud ti klavesnice generuje 10 stisku za vterinu, tak za 60 sekund si mohl zabrat sotva par kB na stacku (zalezi na tom, co vse tam zabiras a alokujes a tak), akorat stack je obvykle par MB, takze se nemuzes norit nekonecne, casem to pretece a spadne

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Matěj Andrle+1
Grafoman
23. 1. 2015   #3
-
0
-

#2 KIIV
Tak jak to rozpojit? V tom cyklu potřebuji neustále chtít nové klávesy... Tak až dostanu pokyn k nové hře - jak ji zavolat? Mě napadá snad jen delegát - event?

Snad vidíš, že si problém uvědomuji sám od sebe... Jen jsem doufal, že to rekurze není.

Nahlásit jako SPAM
IP: 78.136.188.–
karlicek
~ Anonymní uživatel
10 příspěvků
23. 1. 2015   #4
-
0
-

Teda na to, jake tady pan Matej Anderle dava vsem rady a pousti se do nekonecnych flamewar o tom, jak jsou jeho programy nejlepsi a OOP dokonale a pritom nevi takoveto elementarni chovani .NETu... 

Zkoro se mi chce brecet a musim reagovat:

Vsem zacinajicim programatorum, neptejte se na tomto foru, ale na http://stackoverflow.com/. Nechat si radit od arogantniho pana Mateje je proste cesta do pekel.

Nahlásit jako SPAM
IP: 193.245.36.–
Matěj Andrle+1
Grafoman
23. 1. 2015   #5
-
0
-

#4 karlicek
To JÁ od začátku řeším, že mi to přijde špatné! Tak jak mohu být špatný programátor, když to aktivně od začátku řeším?

Nahlásit jako SPAM
IP: 78.136.188.–
karlicek
~ Anonymní uživatel
10 příspěvků
23. 1. 2015   #6
-
+1
-
Zajímavé

Protoze reknes, ze metoda vola v cyklu sebe sama a ptas se, jestli je to vlastne rekurze a co ze se vlastne stane s tim cyklem.. 

Ja bych i drzel hubu a klidne Ti poradil, ale pro procteni tohodle fora, mi Tvoje otazka pripada maximalne usmevna, vzhledem k tomu, ze se prezentujes jako dokonaly programatorsky mozek lidstva a stale vsechny arogantne presvedcujes o Tve pravde.. 

Nahlásit jako SPAM
IP: 193.245.36.–
Matěj Andrle+1
Grafoman
23. 1. 2015   #7
-
0
-

#6 karlicek
Kdybys měl pravdu, tak bych se tu neujišťoval... :D A především - pídím se tu po správném řešení! Jak jsem psal - mě napadá použít delegáta - takto jsem oddělil metodu od vlákna a mohl tak sdílet data mezi vlákny. (A zde o oddělení právě jde.)

Nahlásit jako SPAM
IP: 78.136.188.–
karlicek
~ Anonymní uživatel
10 příspěvků
23. 1. 2015   #8
-
0
-

Ale o vlaknech si nic nepsal. S cim presne mas tedy problem? Trosku lip to popis, ukaz kousek kodu, kterej Te zajima a muze Ti nekdo poradit.

Nahlásit jako SPAM
IP: 77.240.99.–
Matěj Andrle+1
Grafoman
23. 1. 2015   #9
-
0
-

#8 karlicek
Problém je to prostý - potřebuji stejné chování handlování kláves jako v GUI - ovšem v konzoli... Tedy sdílení mezi vlákny jak jsem psal, nebo nevím. Prostě oddělené snímání kláves tak, aby se prováděl kód mimo hlavní cyklus programu. (Tak jako třeba ve Forms, kde mohu mít timer s hlavním „cyklem“ a nezávisle na tom se provádí kód na základě stisklých kláves.)

Nahlásit jako SPAM
IP: 78.136.188.–
Matěj Andrle+1
Grafoman
23. 1. 2015   #10
-
0
-

#8 karlicek
Já si právě poradil! Vytvořil jsem cyklus s velice krátkým Thread.Sleep a tak se velice rychle zpracovávají klávesy - 30 ms. No a hlavní kód si čeká X otáček - do té doby se nastřádá třeba 6 úkonů a to už vypadá vcelu real-time... (Mě to stačí tak jak to mám - vypadá to plynule - žádný problém. Jen nevím, jak mám v tom jednom vláknu dosáhnout kýženého oddělení volání nové hry a hlavního cyklu - kdy to musí sdílet data - což vlákna normálně nesdílí.)

Nahlásit jako SPAM
IP: 78.136.188.–
KIIV
~ Moderátor
+43
God of flame
23. 1. 2015   #11
-
0
-

#10 Matěj Andrle
mimochodem, to neni moznost predhodit to nejakymu select/poll/epoll, ci neco blokujiciho co by nacitalo eventy jako treba klavesnice? Smycka se sleepem zni dost brutalne (tak neresim ani snimani tlacitek u jednocipu)

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Matěj Andrle+1
Grafoman
23. 1. 2015   #12
-
0
-

#11 KIIV
Znovu - neryjte do mě! Já se tu ptám - pročež já tu očekávám odpověď! :D A otázka je jasná - jak v CMD číst klávesy jako s démonem... (Asynchronně.)

Nahlásit jako SPAM
IP: 78.136.188.–
Mutagen
~ Anonymní uživatel
549 příspěvků
24. 1. 2015   #13
-
0
-

#12 Matěj Andrle
Ale to, že ty tu reješ do každýho když se tu ptá je v pohodě? A ani neodepisuj, je to řečnická otázka pro tvoje zamyšlení co jsi napsal, ale přitom to sám děláš ostatním.

Nahlásit jako SPAM
IP: 89.190.90.–
karlicek
~ Anonymní uživatel
10 příspěvků
26. 1. 2015   #14
-
0
-

Mateji, pokud mas ve hre Thread.Sleep, tak je spatne navrzena, nezavisle na tom, co presne ma ten Thread.Sleep delat. Thread.Sleep totiz rozhodne nepotrebujes.

Pokud navrhujes hru, velmi doporucuju kouknout se na XNA.

To je framework pro vyvoj her pro mobiliy, pc, xbox,.... Je to od microsoftu a veci typu cteni klavesnice / joysticku jsou tam vyresene.. Pokud to nechces pouzivat, minimalne se alespon koukni na tu zakladni kostru hry, aby jsi nevymejslel kolo.

Naprosto zakladni flow kazde hry vypada +- takto:

The Initialize method is where you can initialize any assets that do not require a GraphicsDevice to be initialized.
The LoadContent method is where you load any necessary game assets such as models and textures.
The UnloadContent method is where any game assets can be released. Generally, no extra code is required here, as assets will be released automatically when they are no longer needed.
The Update loop is the best place to update your game logic: move objects around, take player input, decide the outcome of collisions between objects, and so on.
The Draw loop is the best place to render all of your objects and backgrounds on the screen.

Viz https://msdn.microsoft.com/en-us/library/bb203893.aspx 

Nahlásit jako SPAM
IP: 193.245.36.–
Matěj Andrle+1
Grafoman
26. 1. 2015   #15
-
-1
-
Mimo téma

#14 karlicek
Panebože, to ne - neříkej, že jsem celý život dělal hry v konzoli zcela zbytečně! Ona existuje nadstavba DirectX??? No to jsem nečekal! To je novinka! V životě jsem nenavrhl horší hru, než tetris, co jsem jej nyní překonvertoval ze starého JS projektu! Jsem takový debil, že používám Sleep v konzoli, kde se stejně nic nebude dít... (Poněvadž konzole ve Woknech funguje jen jednosměrně - nelze získávat real-time informace jako v UNIXu.) Já se tak omlouvám, že jsem tu kdy komu poradil ty svá hovna o OOP atd. Poněvadž já nemám 7 let zkušeností v programování a nic o tom nevím! Tak pardon... NIKDO mi tu neporadil a všichni mne jen napadají - jak mne pak chcete soudit? :D CMD se standardně chová přesně jak píši - to je holý fakt. Chci vstup - dostanu jednu klávesu! Nikdy nedostanu list kláves, či tak. Samozřejmě by to šlo nějak přes C++ knihovny, či tak - leč to mi právě NIKDO NEPORADIL - konkrétní knihovnu, konkrétní funkci. A stejně nevidím NIC špatného na mém řešení. Tak prostě do zásoby sbírám klávesy v krátkém intervalu a jen každý X-tý cyklus provedu logiku hry. (S již nasbíranými X klávesami.) Jak jsem psal - STAČÍ to k plynulému běhu hry - tak proč se v tom vrtat? Chceš si tedy raději měřit úd? Prosím - tak jen do toho - jsem zvědavý, o kolik více toho víš... (Zatím jsi mi kloudně neporadil.)

Nahlásit jako SPAM
IP: 78.136.164.–
karlicek
~ Anonymní uživatel
10 příspěvků
26. 1. 2015   #16
-
0
-

Proboha zlato,  nac tolik vykricniku a otazniku :) 

Zde Ti posilam kod, ktery prave pres ty ceckove knihovny dostane treba 5 klaves najednou a nepotrebujes zadny Thread.Sleep()

namespace Robot.Win.Interpop
{
    /// <summary>
    /// Codes representing keyboard keys.
    /// </summary>
    /// <remarks>
    /// Key code documentation:
    /// http://msdn.microsoft.com/…S.85%29.aspx
    /// </remarks>
    public enum KeyCode : int
    {
        Shift = 0x10,

        Ctrl = 0x11,

        /// <summary>
        /// The left arrow key.
        /// </summary>
        Left = 0x25,

        /// <summary>
        /// The up arrow key.
        /// </summary>
        Up,

        /// <summary>
        /// The right arrow key.
        /// </summary>
        Right,

        /// <summary>
        /// The down arrow key.
        /// </summary>
        Down
    }

    /// <summary>
    /// Provides keyboard access.
    /// </summary>
    public static class NativeKeyboard
    {
        /// <summary>
        /// A positional bit flag indicating the part of a key state denoting
        /// key pressed.
        /// </summary>
        private const int KeyPressed = 0x8000;

        /// <summary>
        /// Returns a value indicating if a given key is pressed.
        /// </summary>
        /// <param name="key">The key to check.</param>
        /// <returns>
        /// <c>true</c> if the key is pressed, otherwise <c>false</c>.
        /// </returns>
        public static bool IsKeyDown(KeyCode key)
        {
            return (GetKeyState((int)key) & KeyPressed) != 0;
        }

        /// <summary>
        /// Gets the key state of a key.
        /// </summary>
        /// <param name="key">Virtuak-key code for key.</param>
        /// <returns>The state of the key.</returns>
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern short GetKeyState(int key);
    }
}

A proc proboha jednas tak urazene, ja bych Ti rad pomohl. Ty ale nejdriv napises, ze nechapes jak funguje rekurze, pak najednou pises o synchronizaci vlaken, aby jsme se nakonec dostali k tomu, ze pouzivas Thread.Sleep.

Ja proste tvrdim, ze Thread.Sleep nepotrebujes a ze je to spatny navrh. Bud trvej na svem, nebo si nech poradit ;)

Nahlásit jako SPAM
IP: 77.240.99.–
karlicek
~ Anonymní uživatel
10 příspěvků
26. 1. 2015   #17
-
0
-

A jeste k Tvemu poslednimu postu:

- unix neni realtime operacni system ani kdyby si sakra moc chtel

- xna neni jen o direct x, od ktereho jses stejne maximalne odstitnen. Jsou tam ale moc hezke navrhove vzory, ktere bych Ti doporucil alespon prozkoumat. Napriklad je tam reseno, ze hra bezi na kazdem pc stejne rychle (pokud neni xna znasilneno :)) ). Toho ty s Thread.Sleepem nemuzes dosahnout, protoze nikdo Ti nikdy nezaruci, ze vlakno pocka presne tu dobu, kterou chces, uz jen kvuli tomu, ze win maji 16ms timer .)

- CMD nema s .NET nic spolecneho, protoze, svete div se, .NET beha i na jinejch operacnich systemech, nez na winu a zadny CMD nemaji ;)

Neber to prosim tolik konfrontacne, ja Te nechci nasrat, jen poradit ;)

Nahlásit jako SPAM
IP: 77.240.99.–
Matěj Andrle+1
Grafoman
26. 1. 2015   #18
-
-1
-
Mimo téma

#17 karlicek
Kde píši o spojistosti CMD a C#? Nevšiml-li sis, tak já od začátku věděl, že potřebuji C/C++ knihovnu! Jenže jak píši - přijde mi to jako zbytečné násilí, když mi stačí nahrabat 5 kláves. Klidně bych mohl používat časovač - třeba vlákna, leč já na Sleepu zkrátka nic špatného nevidím. Já píši OS ve strojovém kódu - nevyprávěj mi tu o RT systémech a chráněném režimu! RT handlování kláves je něco zcela jiného! Je rozdíl, když máš klávesu v zásobníku a z něj vždy pouze jednu odebereš, naproti tomu když máš démona, co rodí aplikace, co handlují klávesy! C# vytváří vlastní konzoli! K původní se můžeš dopracovat, poněvadž je CIL interpretovaný a kernel - jeho interpreter vpodstatě (ano - hodně zobecňuji) - se může dobrat k žádosti o provedení nižší funkce...

Nahlásit jako SPAM
IP: 78.136.164.–
karlicek
~ Anonymní uživatel
10 příspěvků
26. 1. 2015   #19
-
+3
-
Zajímavé

ok ok, ja v assembleru operacny systemy nepisu, takze zalejzam a soupu nohama..

jen posledni, lec dulezita vec pro nepravdepodobne ctenare tohoto vlakna: IL neni interpetovany jazyk, je prelozeny JITem do Tveho milovaneho strojoveho kodu ;)

kazdopadne preji hodne zdaru :)

Nahlásit jako SPAM
IP: 77.240.99.–
Satik0
Stálý člen
27. 1. 2015   #20
-
0
-
Nahlásit jako SPAM
IP: 86.49.188.–
Mutagen
~ Anonymní uživatel
549 příspěvků
27. 1. 2015   #21
-
+3
-
Zajímavé

#18 Matěj Andrle
Ty jo, píšeš OS v asm, ale potřebuješ tu radit jak funguje rekurze?  

Nahlásit jako SPAM
IP: 212.47.26.–
m4r100
Návštěvník
27. 1. 2015   #22
-
0
-

#18 Matěj Andrle
Dobry vtip! :D

Nahlásit jako SPAM
IP: 94.112.137.–
ondrej39+1
Věrný člen
27. 1. 2015   #23
-
0
-

I muží mají své dny.

Nahlásit jako SPAM
IP: 213.226.234.–
Inject all the dependencies!
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 7 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý