NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Ondřej Krsička:28.8.2015 20:33

Ahoj, jak mám udělat, abych nenarušoval chod programu nějakým Console.ReaKey(), ale i tak mohl reagovat na stisknuté klávesy?

Dělám hada v consoli, vše mám hotové, akorát teď potřebuju, abych mohl měnit směr, zatímco se had pořád plazí dál.

Ilustrační příklad:
Mám program, který cyklem vypisuje čísla od 1 do 1 * 1010 bez zastavení a když zmáčknu např. klávesu P, vypíše Ludolfovo číslo a pokračuje dál v cyklu.

 
Odpovědět
28.8.2015 20:33
Avatar
Odpovídá na Ondřej Krsička
Michael Škrášek:28.8.2015 21:34

Přes vlákna :D

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Threading;

namespace Con
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread t = new Thread(vypisuj);
            t.Start();

            while (true)
            {
                ConsoleKeyInfo c = Console.ReadKey();
                if (c.Key == ConsoleKey.P)
                {
                    Console.WriteLine(Math.PI);
                }
            }
        }

        static void vypisuj()
        {
            for (int i = 0; i < 10000; i++)
            {
                Console.WriteLine(i);
                Thread.Sleep(100);
            }
        }
    }
}
Editováno 28.8.2015 21:36
Nahoru Odpovědět
28.8.2015 21:34
"I choose a lazy person to do a hard job. Because that person will find an easy way to do it. " Bill Gates
Avatar
Odpovídá na Michael Škrášek
Patrik Valkovič:28.8.2015 21:49

No to není moc dobré řešení. Jestli začíná (a vzhledem k tomu, že zmiňuje konzolovku tak jo), je zbytečné ho trápit synchronizací mezi vlákny.
Tohle ti pomůže víc
https://msdn.microsoft.com/….110%29.aspx
jestliže bude znak na vstupu, tak jej přečteš, jinak čtení přeskočíš. Jak je i v příkladu, doporučuji to zkombinovat s Console.ReadKe­y(true).
https://msdn.microsoft.com/….110%29.aspx

Nahoru Odpovědět
28.8.2015 21:49
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Jan Vargovský
Tvůrce
Avatar
Jan Vargovský:28.8.2015 21:54

http://www.itnetwork.cz/dev-lighter/473

Tohle jsem před nějakou dobou postoval, třeba najdeš inspiraci v něčem.

 
Nahoru Odpovědět
28.8.2015 21:54
Avatar
Odpovídá na Jan Vargovský
Patrik Valkovič:28.8.2015 22:01

Neměly by se objekty, ke kterým se přistupuje ve vlákně, zamykat? A vůbec, přistupovat k proměnné, kterou vlákno dostalo z vnějšího kontextu, místo aby ji dostalo v parametru, to by se taky vyskytovat nemělo.
Nevím teda, jestli se jedná o vhodný příklad...

Nahoru Odpovědět
28.8.2015 22:01
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Odpovídá na Patrik Valkovič
Michael Škrášek:28.8.2015 22:14

Kdyby nedělal hada v konzoli, tak synchronizaci nemusí řešit - použil by timer.

Nahoru Odpovědět
28.8.2015 22:14
"I choose a lazy person to do a hard job. Because that person will find an easy way to do it. " Bill Gates
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Patrik Valkovič
Jan Vargovský:28.8.2015 22:15

Nic protithreadového tam nevidím, jestli máš nějaký návrh, uprav a pošli.

 
Nahoru Odpovědět
28.8.2015 22:15
Avatar
Ondřej Krsička:28.8.2015 22:34

Tak to mám hotové :-) udělal jsem to jednoduše:

ConsoleKey c_key = ConsoleKey.DownArray;
if (Console.KeyAvailable)
        c_key = Console.ReadKey().Key;
 
Nahoru Odpovědět
28.8.2015 22:34
Avatar
Odpovídá na Patrik Valkovič
Ondřej Krsička:28.8.2015 22:42

Ohledně těch vláken, přečetl jsem si tady na itnetwork.cz úvod a autor od nich docela odrazuje. Ani jsem ještě nenarazil na případ, kdy bych je musel použít.

Mohl bych někdy udělat program, který si zapíše do registru, aby se zapínal po spuštění PC. Potom by se zapnul výpočet na všechny jádra nebo by se soubory zuřivě kopírovaly a mazaly atd. Ty programy by byly dva. Když by se vypl jeden, druhý by ho zapnul, to samé naopak. Takový vir :D
Šlo by to? :D :D

 
Nahoru Odpovědět
28.8.2015 22:42
Avatar
Odpovídá na Ondřej Krsička
Ondřej Krsička:28.8.2015 22:43

Ten výpočet by vytížil CPU na 100%

 
Nahoru Odpovědět
28.8.2015 22:43
Avatar
Odpovídá na Jan Vargovský
Patrik Valkovič:28.8.2015 22:44

S vlákny jsem se moc do hloubky nezabýval, ale jestliže mají dvě vlákna přístup do stejné paměti, měla by být paměť synchronizovaná tak, aby se nestalo, že jedno vlákno bude zapisovat a druhé vlákno bude ze stejného místa číst. Aspoň tak to mám naučené já. V tom kódu není nic, co by takové situaci zabránilo.

Nahoru Odpovědět
28.8.2015 22:44
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Ondřej Krsička
Petr Čech:28.8.2015 22:50

Ano, jde to, ale antivir by mohl protestovat.

Nahoru Odpovědět
28.8.2015 22:50
the cake is a lie
Avatar
Ondřej Krsička:28.8.2015 22:57

Abych si nerozkopal PC, radši to dělat nebudu.

 
Nahoru Odpovědět
28.8.2015 22:57
Avatar
Odpovídá na Patrik Valkovič
Luboš Běhounek Satik:29.8.2015 10:43

Tady zrovna žádné zamykání ani synchronizace potřeba nejsou, maximálně bych k

private Direction direction;

přidal pro jistotu volatile, protože tu proměnnou mění v druhém vlákně.

Nahoru Odpovědět
29.8.2015 10:43
https://www.facebook.com/peasantsandcastles/
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 14 zpráv z 14.