Diskuze: C# Problém se sleepem / vymazání key bufferu
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 9 zpráv z 9.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


Kam jsi vlozil ten cyklus na vymazani bufferu? Zkus ho vlozit tesne pod ten switch blok. Melo by to prvni klavesu precist a zbytek zahodit.
Ano, ovšem toto řešení není úplně ideální. Když poté držím klávesu a zmáčknu druhou zatímco první ještě držím, tak tu nastane minimálně 0,5 s pomlka než se začne provádět příkaz jaký má.
Proto hledám nějaké lepší řešení (jestli teda existuje).
Ta pomlka je způsobena běžným Keyboard Repeat Delay http://www.dummies.com/…repeat-rate/
Bohužel v konzolové aplikaci neexistuje rozumný způsob jak to obejít.
Musel bys to udělat alespoň ve WinForms, kde pak můžeš pomocí Timeru
zjišťovat stav klávesy.
Díky za odpověď, ano máš pravdu. Ale možná by šlo tento problém vyřešit jinak.
Když to úplně zobecním, tak problém nastává tehdy, když je vlákno ve sleepu, tak pořád zaznamenává stisk kláves. Přemýšlel jsem jestli třeba nejde to vlákno plně zamčít na určitou dobu (Takový lepší sleep).
Console.Write("Wait");
System.Threading.Thread.Sleep(5000);
Console.Read();
Pokud zde v tech 5s budeme busit do klavesnice, tak se stejne klavesy budou zaznamenavat a vypisi se po sleepu.
Tomu repeat delay se v klasické konzoli nevyhneš. Ještě to můžeš
obejít přes platform invoke třeba takto
:
class Program
{
private const int KEY_PRESSED = 0x8000;
[DllImport("USER32.dll")]
static extern short GetKeyState(ConsoleKey key);
private static bool IsKeyDown(ConsoleKey key)
{
return (GetKeyState(key) & KEY_PRESSED) > 0;
}
static void Main(string[] args)
{
int x = Console.WindowWidth / 2;
int y = Console.WindowHeight / 2;
while (true)
{
System.Threading.Thread.Sleep(100);
if (IsKeyDown(ConsoleKey.LeftArrow))
x = Math.Max(0, x - 1);
if (IsKeyDown(ConsoleKey.RightArrow))
x = Math.Min(Console.WindowWidth - 1, x + 1);
if (IsKeyDown(ConsoleKey.UpArrow))
y = Math.Max(0, y - 1);
if (IsKeyDown(ConsoleKey.DownArrow))
y = Math.Min(Console.WindowHeight - 1, y + 1);
Console.SetCursorPosition(x, y);
Console.Write('*');
}
}
}
Tvoje řešení mi strašně pomohlo, díky moc! Funguje jak má!
Díky
PS. Trošku tam nechápu ten bitovej AND u
return (GetKeyState(key) & KEY_PRESSED) > 0;
ale to snad přeziju 
To jsem rád. Jde o to, že výsledkem WinAPI funkce GetKeyState je hodnota
typu short.
Nás zajímá jen jestli je klávesa zmáčknutá a podle dokumentace ( https://msdn.microsoft.com/…=vs.85).aspx ) to poznáme tak,
že nejvyšší bit vrácené hodnoty je nastaven na 1.
Zavoláním "GetKeyState(key) & 0x8000" si vymaskujeme tento nejvyšší bit
v shortu a zjistíme jestli je nastaven. 0x8000 totiž odpovídá bitům
1000000000000000.
Když zkusíš něco podobného jako toto, zjistíš jak vypadají bity ve
vráceném shortu při stisku levé šipky:
while (true)
{
Console.SetCursorPosition(0, 0);
Console.WriteLine(Convert.ToString(GetKeyState(ConsoleKey.LeftArrow), 2).PadLeft(16, '0'));
}
Děláš dobře že to chceš pochopit a ne jen zkopírovat 
Jasný, chápu. Za toto vysvětlení ještě větší dík než za ten
zdroják, protože to vysvětlení dá člověku víc. 
Je zajímavý jak to funguje, a je dobré vědět, že ten poslední bit může sloužit (on slouží) jako přepínač.
Díky 
Zobrazeno 9 zpráv z 9.