Avatar
Ondřej Krsička
Redaktor
Avatar
Ondřej Krsička:

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:

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
Proč to dělat složitě, když to jde jednoduše.
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Michael Škrášek
patrik.valkovic:

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ý
Redaktor
Avatar
Jan Vargovský:

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
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Jan Vargovský
patrik.valkovic:

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.valkovic
Michael Škrášek:

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

Nahoru Odpovědět 28.8.2015 22:14
Proč to dělat složitě, když to jde jednoduše.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na patrik.valkovic
Jan Vargovský:

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

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

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  +2 28.8.2015 22:34
Avatar
Ondřej Krsička
Redaktor
Avatar
Odpovídá na patrik.valkovic
Ondřej Krsička:

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
Ondřej Krsička
Redaktor
Avatar
Odpovídá na Ondřej Krsička
Ondřej Krsička:

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

 
Nahoru Odpovědět 28.8.2015 22:43
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Jan Vargovský
patrik.valkovic:

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
Odpovídá na Ondřej Krsička
Petr Čech (czubehead):

Ano, jde to, ale antivir by mohl protestovat.

Nahoru Odpovědět 28.8.2015 22:50
Why so serious? -Joker
Avatar
Ondřej Krsička
Redaktor
Avatar
Ondřej Krsička:

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

 
Nahoru Odpovědět 28.8.2015 22:57
Avatar
Odpovídá na patrik.valkovic
Luboš Běhounek (Satik):

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
:)
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.