Getch() s timeoutem v C – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Getch() s timeoutem v C – C / C++ – Fórum – Programujte.comGetch() s timeoutem v C – C / C++ – Fórum – Programujte.com

 

malv
~ Anonymní uživatel
3 příspěvky
16. 5. 2012   #1
-
0
-

Zdravím,

potřeboval bych v C nějak udělat getch() s timeoutem. Konkrétně mám program, v kterém se má postupně vypsat 7 řádků - používám tedy sleep(3000). Problém je právě ten, že potřebuju mít možnost to klávesou ESC přerušit a tedy vyjet z cyklu. Napadlo mě použít getchar pro zaznamenání ESC, ale netuším jak udělat právě ten "timeout" - aby se po tom sleepu příkaz getchar přeskočil. Napadlo mě použití fork(), ale to lze pouze v UNIXu. Nenapadá někoho jak to provést ve windowsech?

Nahlásit jako SPAM
IP: 84.242.81.–
KIIV
~ Moderátor
+43
God of flame
16. 5. 2012   #2
-
0
-

muzes zkusit select nebo poll pro stdin ...

nebo novy thread..

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ingiraxo+15
Grafoman
16. 5. 2012   #3
-
0
-

Udělěj nový vlákno, kde bude cyklus s těma řádkama a sleepem a jako podmínku dej ref. na bool (nebo jinak), co budeš moct změnit na false a ukončit tak cyklus i vlákno

Nahlásit jako SPAM
IP: 46.183.64.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
yaqwsx+9
Posthunter
16. 5. 2012   #4
-
0
-

Je to cca. rok, co mi zde na fóru KIIV poradil s podobným problémem - existuje na to funkce ve standardní knihovně. Zaboha si však nemohu vzpomenout na jméno ani na disku najít projekt, ve kterém jsem to použil.

Tehdy jsem načítal data ze sériového portu.

Nahlásit jako SPAM
IP: 85.160.58.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
yaqwsx+9
Posthunter
16. 5. 2012   #5
-
0
-

Nakonec jsem to našel, ale bohužel je to pro C++. KIIV mi doporučil funkci istrea::readsome http://www.cplusplus.com/reference/iostream/istream/readsome/. Tato fuknce čte ze zadaného streamu n bytů. Pokud však nejsou dostupná další data, okamžitě vrátí. Tzn. můžeš ji volat v cyklu a vždy na konci smyčky kontrolovat čas.

Nahlásit jako SPAM
IP: 85.160.58.–
Life is too short to remove USB mass storage safely...
Správný drsňák udělá z konzole cokoliv
Doomista+1
Stálý člen
16. 5. 2012   #6
-
0
-

pokud jsem tě pochopil správně, tak mě napadl asi celkem neefektivní, ale funkční postup - co takhle tam dát loop, v každém cyklu zjistit, zda nebyla stisknuta klávesa a pak dát sleep třeba na 10ms a opakovat to 300x?

Nahlásit jako SPAM
IP: 83.240.1.–
Na vše stačí iostream...
malv
~ Anonymní uživatel
3 příspěvky
17. 5. 2012   #7
-
0
-

#6 Doomista
jj nad tím jsem taky uvažoval a vypotil

for(i=0;i<100;i++){
printf("neco\n");
sleep(30);
if(kbhit()) break;
}

nicmeně potřebuju to přerušovat pouze klavesou ESC, kdežto při stisknuté klávese mi kbhit() vyplivne jen "1".

jinak nové vlákno by možná nebylo špatné udělat, nicmeně tak trošku netuším jak, tak zběhlej v C ještě nejsem, a google mi moc neporadil. Část kódu kam to chci narvat vypadá nějak takto:

for(cislo=1;cislo<=7;cislo++){
printf("\n%d. Cislo... ",cislochev);
sleep((rand()%3000)); // 0 - 3000 milisekund
printf("OK!");
}

Jak tedy do tohodle narvat druhé vlákno s čekajícím if(getchar() == ESC) break; ?

Nahlásit jako SPAM
IP: 90.181.3.–
Doomista+1
Stálý člen
17. 5. 2012   #8
-
0
-

#7 malv
protože kbhit ti řekne, zda byla stisknuta klávesa, potřebuješ i funkci getch() a proměnnou do které uložíš vstup

int key;
if(kbhit())
key=getch();
if(key==27)
break;
#ifndef	_KEYCONST_H_
#define	_KEYCONST_H_

const signed short A=97;
const signed short B=98;
const signed short C=99;
const signed short D=100;
const signed short E=101;
const signed short F=102;
const signed short G=103;
const signed short H=104;
const signed short I=105;
const signed short J=106;
const signed short K=107;
const signed short L=108;
const signed short M=109;
const signed short N=110;
const signed short O=111;
const signed short P=112;
const signed short Q=113;
const signed short R=114;
const signed short S=115;
const signed short T=116;
const signed short U=117;
const signed short V=118;
const signed short W=119;
const signed short X=120;
const signed short Y=121;
const signed short Z=122;
const signed short _1=43;
const signed short _2=-40;
const signed short _3=-25;
const signed short _4=-97;
const signed short _5=-3;
const signed short _6=-89;
const signed short _7=55;
const signed short _8=56;
const signed short _9=57;
const signed short _0=47;
const signed short UP=72;
const signed short DOWN=80;
const signed short LEFT=75;
const signed short RIGHT=77;
const signed short PG_UP=73;
const signed short PG_DOWN=81;
const signed short HOME=71;
const signed short END=79;
const signed short ENTER=13;
const signed short ESC=27;
const signed short BACKSPACE=8;
const signed short SPACE=32;

#endif

tohle by se ti mohlo do budoucna hodit ;)

Nahlásit jako SPAM
IP: 83.240.1.–
Na vše stačí iostream...
Doomista+1
Stálý člen
17. 5. 2012   #9
-
0
-

#8 Doomista
ale pokud chceš použít klávesy pro šipky nebo PG UP/DOWN, HOME, END, musíš tam mít tento kód:

int key;
	if(kbhit()){
	key=getch();
		if(key==-32)
		key=getch();
	}
	if(key==....){
	...
	}
Nahlásit jako SPAM
IP: 83.240.1.–
Na vše stačí iostream...
malv
~ Anonymní uživatel
3 příspěvky
17. 5. 2012   #10
-
0
-

#9 Doomista
Díky moc, todle je přesně to co jsem potřeboval.

Nahlásit jako SPAM
IP: 90.181.3.–
Doomista+1
Stálý člen
17. 5. 2012   #11
-
0
-

#10 malv
není zač ;) strávil jsem hodně času s těmadle blbinama, když jsem si vytvářel dooma v příkazovce, aspoň to pomohlo i někomu jinýmu :)

Nahlásit jako SPAM
IP: 83.240.1.–
Na vše stačí iostream...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 29 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý