NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Petr Vít
Člen
Avatar
Petr Vít:22.2.2018 9:19

Zdravim,

rad bych se vas se zeptal jak v jednoduché konzolové aplikaci dosahnu toho aby program stále běžel?

Klasicky program probehne cely kod a ukonci se. Mě se ale přes API mění proměnné a tudíž potřebuji aby se program neustále opakoval. Jak toho nejsnáze docílit?

Díky

 
Odpovědět
22.2.2018 9:19
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na Petr Vít
Ondřej Štorc:22.2.2018 10:42

Třeba přes nekonečný cyklus?

Nahoru Odpovědět
22.2.2018 10:42
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
David Dostal
Tvůrce
Avatar
Odpovídá na Petr Vít
David Dostal:22.2.2018 10:47

Ahoj, snad jsem správně pochopil otázku. Pokud chceš něco stále dokola opakovat, můžeš použít while cyklus.
https://www.itnetwork.cz/…ly-for-while
While funguje tak, že se kód opakuje pokud je splněná daná podmínka. Například:

bool pokracovat = true;
while(pokracovat)
{
    // tento kód se bude opakovat dokud platí, že pokracovat == true
}

Když pak budeš chtít s opakováním skončit v cyklu nastav pokracovat na false.

Doporučuju si projít zdejší seriál C#.

Editováno 22.2.2018 10:48
 
Nahoru Odpovědět
22.2.2018 10:47
Avatar
Petr Vít
Člen
Avatar
Petr Vít:22.2.2018 11:27

Pardon, nevyjadril jsem se uplne. Cyklu while jsem si vedom. Avsak prisel mi dost nepraktický z důvodu zátěže pc. Ovsem pokud ho doporucujete tak ho pouziji.
Já bych ale rád z té konzole ovladal zapnutí a vypnutí programu.
Napriklad pokud se program zepta "Spustit program? y/n".
Tak po zadaní y se bool nastaví na true a cyklus jede. Ael co kdyz ho chci v nejake fázi zastavit napriklad dalsim stiskem klavesy a poté zase opetovne spustit?

Díky

 
Nahoru Odpovědět
22.2.2018 11:27
Avatar
Patrik Řepa
Člen
Avatar
Odpovídá na Petr Vít
Patrik Řepa:22.2.2018 11:45

Pro opakované spouštění jsme používali nuget balíček Quartz. Nastavis si tam jak často chceš spouštět a metoda se provede. Myslím že tam jde nastavit ať se nepouští metoda znova, pokud první nedoběhla.

 
Nahoru Odpovědět
22.2.2018 11:45
Avatar
Odpovídá na Petr Vít
Luboš Běhounek Satik:22.2.2018 11:48

Nic lepsiho nez nekonecny cyklus nevymyslis. :)

Abys nezatezoval PC, tak staci vzdycky po kazdym prubehu zavolat treba

Thread.Sleep(20);
Nahoru Odpovědět
22.2.2018 11:48
https://www.facebook.com/peasantsandcastles/
Avatar
Petr Vít
Člen
Avatar
Petr Vít:22.2.2018 12:07

Ok, super. A da se tedy jeste docilit toho aby se z cyklu vyskocilo na zaklade uzivatelskeho vstupu?

 
Nahoru Odpovědět
22.2.2018 12:07
Avatar
nickname01
Člen
Avatar
Odpovídá na Petr Vít
nickname01:22.2.2018 14:36

Možná ti pomůže toto:

bool pokracovat = true;
while (pokracovat)
{
        //Sem napiš co má program dělat
        Console.Write("Chceš pokračovat? ano/ne");
        string odpoved = Console.ReadLine();
        pokracovat = odpoved == "ano";
        //Kontrola vstupu
        bool chybnyVstup = odpoved != "ano" && odpoved != "ne";
        if (chybnyVstup) while (chybnyVstup)
        {
                //Sem vlož ošetření chybného vstupu, třeba něco jako Console.Write("Neplatný vstup, zadej odpověď znovu")
                odpoved = Console.ReadLine();
                pokracovat = odpoved == "ano";
                chybnyVstup = odpoved != "ano" && odpoved != "ne";
        }
}

Psal jsem to bez jakýchkoliv pomocných metod a OOP obecně, protože tvoje otázka mi přišla začátečnická tak jsem se neopíral o to že to budeš znát :-) Kdyžtak si to můžeš do OOP přepsat.

Doufám že jsem pochopil tvoji otázku :-)

Editováno 22.2.2018 14:39
 
Nahoru Odpovědět
22.2.2018 14:36
Avatar
Petr Vít
Člen
Avatar
Petr Vít:22.2.2018 17:19

Diky moc za odpoved.. OOP trochu znam ale jinak jsi me na zacatecnika odhadl dobre. :)
Ovsem tohle co pises nuti uzivatele u kazdeho iritace zadavat ano. Pocitam ze tech iritaci bude treba 1000 nez to uzivatel stopne. Takze to neni uplne prakticke.

Smeroval jsem spis k tomu jak jsou napsány programy kde zkratka stisknes tlacitko START, neco se deje a pak STOP a program se zastavi...

 
Nahoru Odpovědět
22.2.2018 17:19
Avatar
Odpovídá na Petr Vít
Radek Chalupa:22.2.2018 17:43

a musí to být nutně konzolová aplikace? když budeš mít aplikaci s oknem a frontou zpráv, tak při nečinnosti (tj. když uživatel nějak požaduje "stop") zatěžuje procesor ještě méně než stále běžící cyklus se sleepem)..

 
Nahoru Odpovědět
22.2.2018 17:43
Avatar
Robert Ďurica:22.2.2018 18:36

Suhlasim. Inak ja by som to spravil rekurzivne ked to chce v konzoli a aby to reagovalo na nejaku klavesu.

static void Main(string[] args)
{
    Console.WriteLine("Do you want to continue ? (ano/ne)");
    string result = Console.ReadLine();
    bool resume = (result == "ano") ? true : false;

    while (!Console.KeyAvailable && resume == true)
    {
        Console.WriteLine("Working... Press any key to stop");
    }

    Main(args);
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
22.2.2018 18:36
Avatar
Petr Vít
Člen
Avatar
Petr Vít:22.2.2018 18:46

Nutně konzolová být nemusí. Ale nemyslím si že jsem schopne momentalné napsat neco ve WindowsForm...
Ale všem dekuji...

Robertovi dekuji obzvlast, to je to co jsem hledal... Hlavne me nikdy nenapadlo ze se da volat hlavní funkce. Takze jsem osvícen :D

Editováno 22.2.2018 18:47
 
Nahoru Odpovědět
22.2.2018 18:46
Avatar
nickname01
Člen
Avatar
Odpovídá na Petr Vít
nickname01:22.2.2018 19:20

Ale nemyslím si že jsem schopne momentalné napsat neco ve WindowsForm...

Proč chceš psát něco ve WinForms? Proč ne WPF?

 
Nahoru Odpovědět
22.2.2018 19:20
Avatar
Odpovídá na nickname01
Neaktivní uživatel:23.2.2018 2:34

Protože je začátečník a v momentě kdy to psál, nevěděl že existuje nějaké WPF nebo že WPF není tosamé co WinForms?

PS: Nemyslím si, že je to dobra praktika volat rekurzivně metodu Main(v C# zatím moc nedělám).

Editováno 23.2.2018 2:36
Nahoru Odpovědět
23.2.2018 2:34
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Robert Ďurica:23.2.2018 10:28

Nemyslím si, že je to dobra praktika volat rekurzivně metodu Main

No suhlasim jenom ked ze c# zacina a este si netrufne ani na WPF tak mi to pride ako najjednoduhsie riesenie ako sa dostat na pozadovany vysledek(ked nepocitam do while ktorym by to taky slo ale nebolo by to to same).To som mu rovno mohol napisat asynchronni task ktory by mu bol na 2 veci. Takto uz aspon vie aka je rekurzivni metoda.

 
Nahoru Odpovědět
23.2.2018 10:28
Avatar
nickname01
Člen
Avatar
Odpovídá na Neaktivní uživatel
nickname01:23.2.2018 13:43

Nemyslím si, že je to dobra praktika volat rekurzivně metodu Main(v C# zatím moc nedělám).

Kdo mluvil o rekurzivním volání metody Main?

 
Nahoru Odpovědět
23.2.2018 13:43
Avatar
Marian Benčat:23.2.2018 17:10

LOL jako řešení označeno něco, kde je neukončená rekurze, tak to jsem ještě nežral - dokonce ani tady na itnetworku :D :D :D :D

Nahoru Odpovědět
23.2.2018 17:10
Totalitní admini..
Avatar
vosa53
Člen
Avatar
vosa53:23.2.2018 17:48

Jinak kdyby někdo náhodou nevěděl co je s tou neukončenou rekurzí špatně, tak je to to, že každé rekurzivní volání spotřebuje nějakou paměť ze zásobníku a ta logicky není nekonečná... ;)

Editováno 23.2.2018 17:50
 
Nahoru Odpovědět
23.2.2018 17:48
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Marian Benčat
ostrozan:23.2.2018 20:42

Mně zas fascinuje, že nikdo neřeší co on vlastně chce

>Já bych ale rád z té konzole ovladal zapnutí a vypnutí programu.

Chce program pro zapínání jiného programu, nebo otevírat program z programu, který zrovna zavřel a nemá teda kam napsat to "y"

>Napriklad pokud se program zepta "Spustit program? y/n".

 
Nahoru Odpovědět
23.2.2018 20:42
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na ostrozan
gcx11:23.2.2018 20:55

To IMO nechce:

Mě se ale přes API mění proměnné a tudíž potřebuji aby se program neustále opakoval. Jak toho nejsnáze docílit?

 
Nahoru Odpovědět
23.2.2018 20:55
Avatar
Petr Vít
Člen
Avatar
Petr Vít:23.2.2018 21:48

Moc Vám všem dekuji za komentare. Ano jako zacatecnik vse resim za pochodu a oznacil jsem reseni ktere se mi tak zdalo. To ze by to po case zaplnilo pamet jsem nevedel.

Uz to pasuju. do WPF. Ale problem zustava stejny. Jednim tlacitkem (START) spustím smycku a po nejake dobe bych ji zase rad vypl jinym tlacitkem (STOP). Myslim ze tohle se musi dat nejak resit.
Pokud mam nejakou instalacku tak taky po kliknutí na INSTAL mate moznost "Pause" nebo "Cancel" pro zastavení. Neco podobneho mam na mysli. :-)

 
Nahoru Odpovědět
23.2.2018 21:48
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Petr Vít
gcx11:23.2.2018 22:06

Asi bys potřeboval něco jako toto:
https://stackoverflow.com/…ync-function

 
Nahoru Odpovědět
23.2.2018 22:06
Avatar
Robert Ďurica:23.2.2018 22:08

Dajte teda reseni ktore mu bude vyhovovat misto toho aby o tom kazdy jen kecal.

LOL jako řešení označeno něco, kde je neukončená rekurze, tak to jsem ještě nežral

Proto ze to oznacil ako reseni neznamena ze nemuzes postnut neco lepsi.

Pride mi to ze kazdy vsetko umi, vsetci vedi co je spatne ale nikto nic konstruktivneho nenapise... Kazdy neco hodnoti ale k jeho problemu se vyjadrilo jen par lidi. Jako nehnevajte se na mne ale tato debata mu bude na 2 veci...

 
Nahoru Odpovědět
23.2.2018 22:08
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na gcx11
ostrozan:23.2.2018 22:14

Tak proč by to psal, kdyby to nechtěl?
A na to, co cituješ přece dostal odpovědí několik - bohužel si vybral tu nejhorší možnou

Editováno 23.2.2018 22:16
 
Nahoru Odpovědět
23.2.2018 22:14
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Robert Ďurica
gcx11:23.2.2018 22:17

To ostatním hodně křivdíš, správný postup tu byl napsaný, hned první odpověď byla "while cyklus" a o pár odpovědí dále, aby použil

Thread.Sleep

pokud nechce zbytečně vytěžovat CPU.

ostrozan To ví jedině OP, k čemu to přesně chce, ale tipuji, že tahá data z webu nebo tak něco a pak s nimi pracuje nějak.

Editováno 23.2.2018 22:19
 
Nahoru Odpovědět
23.2.2018 22:17
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Petr Vít
DarkCoder:23.2.2018 22:27

V čem je problem? Vytvoř signální proměnnou a nastav její počáteční hodnotu. V nekonečném cyklu vlož vlastní výpočet do bloku v podmínce řízeného signální proměnnou. Dále vytvoř neblokující funkci detekující vstupy uživatele, kterou budeš volat v nekonečném cyklu. Analyzuj vstup a na základě podmínky provádějící kontrolu nad nekonečným cyklem proveď přepnutí signální proměnné, čímž odpojíš nebo připojíš blok s vlastním výpočtem.

Nahoru Odpovědět
23.2.2018 22:27
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Petr Vít
ostrozan:23.2.2018 22:34

Jsem rád že nakonec jsi zvolil naopak to nejlepší řešení z nabízených, ale myslím že jsi zbytečně úzkostlivý ohledně vytěžování procesoru - tuhle tvoji aplikaci nejspíš ani nepozná - schválně se podívej, kolik ti běží procesů jenom na samotných Windows a to nemusíš mít ani nic dalšího spuštěného.
Tohle prostě neřeš.

 
Nahoru Odpovědět
23.2.2018 22:34
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na ostrozan
ostrozan:23.2.2018 22:49

Ještě dodám :
co to je proti JVM která mi žere 30% výkonu i5ky

 
Nahoru Odpovědět
23.2.2018 22:49
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 28 zpráv z 28.