Diskuze: C# Console - zmáčknutí klávesy
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 14 zpráv z 14.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Přes vlákna
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);
}
}
}
}
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.ReadKey(true).
https://msdn.microsoft.com/….110%29.aspx
http://www.itnetwork.cz/dev-lighter/473
Tohle jsem před nějakou dobou postoval, třeba najdeš inspiraci v něčem.
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...
Kdyby nedělal hada v konzoli, tak synchronizaci nemusí řešit - použil by timer.
Nic protithreadového tam nevidím, jestli máš nějaký návrh, uprav a pošli.
Tak to mám hotové udělal jsem to jednoduše:
ConsoleKey c_key = ConsoleKey.DownArray;
if (Console.KeyAvailable)
c_key = Console.ReadKey().Key;
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
Šlo by to?
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.
Abych si nerozkopal PC, radši to dělat nebudu.
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ě.
Zobrazeno 14 zpráv z 14.