.[ ČeskéHry.cz ].
neblokující vstup z konzole
Jdi na stránku 1, 2  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
bolejt



Založen: 02. 05. 2009
Příspěvky: 45

PříspěvekZaslal: 14. září 2009, 11:40:22    Předmět: neblokující vstup z konzole Odpovědět s citátem

chtěl jsem použít vstup z konzole jako vstup debugovací konzole,
tj. aplikace čas o času mrkne, jestli jsem něco neposlal typu "funkce()\n" a pokud ano, tak to zpracuje, když ne, jede se dál.
jenže všechny operace se std::cin/stdin jsou blokující a neblokující metoda readsome(...) nepřečte pro změnu nic.
trochu jsem hledal a prý to bez vláken nepůjde, ale to znamená přidat do aplikace řekl bych úplně zbytečně vlákna, navíc to jsou další závislosti... Sad

nevěděl/neporadil by někdo něco?
_________________
Ball ball8;
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 14. září 2009, 13:31:42    Předmět: Odpovědět s citátem

Proste to spravit cez vlakna. Nechapem, co as ti na tom nezda.
To vlakno, ktore bude ocakavat vstup bude proste zablokovane a nebude zrat CPU. A ked user nieco natuka, upozornis hlavne vlakno a hotovo (nejako, signalom, semaforom...). Dalsie zavislosti?
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 14. září 2009, 13:40:18    Předmět: Odpovědět s citátem

Na multiplatformní vlákna je dobrá knihovna openthreads, je hodně minimalistická.
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 14. září 2009, 14:41:23    Předmět: Odpovědět s citátem

poznam C funkciu kbhit(). mam ale pocit ze bude fungovat len na win.
_________________
Najjednoduchšie chyby sa najtažšie hľadajú.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
uiii



Založen: 12. 08. 2007
Příspěvky: 251

PříspěvekZaslal: 14. září 2009, 15:34:21    Předmět: Odpovědět s citátem

no me napadlo jak to resit bez vlaken: misto toho aby program kontroloval prikazovou radku, tak bude kontrolovat obsah nejakyho souboru, kdo kteryho budes zapisovat nejakym jednoduchym programkem ty prikazy - proste v kdyz v tom souboru neco bude tak to zpracuje a smaze, jinak nic.
_________________
Twitter
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
backgen



Založen: 21. 08. 2009
Příspěvky: 11
Bydliště: Pribram

PříspěvekZaslal: 14. září 2009, 16:23:17    Předmět: Odpovědět s citátem

uiii napsal:
no me napadlo jak to resit bez vlaken: misto toho aby program kontroloval prikazovou radku, tak bude kontrolovat obsah nejakyho souboru, kdo kteryho budes zapisovat nejakym jednoduchym programkem ty prikazy - proste v kdyz v tom souboru neco bude tak to zpracuje a smaze, jinak nic.

Nebude tady zase problem s tim kdy jse ti dostane soubor na disk?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 14. září 2009, 16:37:16    Předmět: Odpovědět s citátem

backgen napsal:
uiii napsal:
no me napadlo jak to resit bez vlaken: misto toho aby program kontroloval prikazovou radku, tak bude kontrolovat obsah nejakyho souboru, kdo kteryho budes zapisovat nejakym jednoduchym programkem ty prikazy - proste v kdyz v tom souboru neco bude tak to zpracuje a smaze, jinak nic.

Nebude tady zase problem s tim kdy jse ti dostane soubor na disk?


OT: boha za vyraz 'jse' by se melo strilet - je to samozrejme 'se'

A ted vec druha - v momente kdy zavolas 'CloseFile' tak se to povazuje za zapsane. A dalsi volani 'OpenFile' na dany soubor ti korektne vrati jeho obsah. A to je jedno jestli nekde z cache (protoze to widle jeste neflushly) a nebo primo z disku.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 14. září 2009, 16:40:32    Předmět: Odpovědět s citátem

ale jinak otevri si v programu nejakej port a prikazy cekej na nem - pak je lze proste posilat telnetem a hotovson
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
bolejt



Založen: 02. 05. 2009
Příspěvky: 45

PříspěvekZaslal: 14. září 2009, 19:41:26    Předmět: Odpovědět s citátem

ten telnet třeba pomocí boost::asio, to zní docela šikovně a jednoduše, ale už jsem hotov s vedlejším vláknem.
díky za pomoc. Wink
_________________
Ball ball8;
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Tringi



Založen: 28. 07. 2007
Příspěvky: 290

PříspěvekZaslal: 15. září 2009, 00:13:00    Předmět: Odpovědět s citátem

Pánové, řešíte to všichni trochu moc komplikovaně. Použití vláken pro něco takového je overkill, člověk se pak učí používat vlákna všude a velké projekty se pak přetváří v nespravovatelné monolity plné heisenbugů.

Multiplatformě to je vždycky problém, ale: Na Posixech (Linuxu, ...) lze použít funkci select nad deskriptorem 0, což je standardní vstup. Pokud nastavíte časový parametr na nulu (nikoliv ale NULL), v podstatě se jednoduše dotážete, zda jsou ve vstupním bufferu nějaké znaky. Čte se funkcí read, ale to jistě víte. Na Windows pak lze použít jak zmíněné kbhit/getch, tak techniku obdobnou výše pomocí GetStdHandle/WaitForSingleObject/ReadFile.

Jinak, doporučuji zvážit alternativu kdy zpracování (daemon) běží na pozadí a příkazový interpret se spouští jako malý pomocný prográmek jen za účelem předání příkazu. Je to typické řešení.
_________________
WWW | GitHub | TW
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Al



Založen: 23. 10. 2007
Příspěvky: 196

PříspěvekZaslal: 21. září 2009, 21:05:13    Předmět: Odpovědět s citátem

Jaky je rozdil mezi NULL a 0? Virius pise, ze zadny.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
frca



Založen: 28. 07. 2007
Příspěvky: 1561

PříspěvekZaslal: 21. září 2009, 21:14:32    Předmět: Odpovědět s citátem

V C určitě žádný (až na to, že NULL nemusí být definovaný).
_________________
www.FRANTICWARE.com
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 21. září 2009, 21:38:01    Předmět: Odpovědět s citátem

Al> v pripade funkce select, ktere cas predavas pomoci pointeru na strukturu, je rozdil mezi hodnotou NULL a nulovym casem (tedy pointerem na strukturu reprezentujici nulovy cas) nenulovy Wink
_________________
http://trionteam.net
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
bolejt



Založen: 02. 05. 2009
Příspěvky: 45

PříspěvekZaslal: 21. září 2009, 21:40:08    Předmět: Odpovědět s citátem

kdysi jsem se dočetl, že v C je 0 a NULL odlišná věc.
NULL mám dojem je nějaké makro ve stylu:
kód:
#define NULL (void*)0

zatímco v C++ je to ta nula.
kód:
#define NULL 0

ale neříkám, že se možná nemýlím :)

já sám používámi v C++ NULL, je to taková vizuální připomínka, že ukazatel nyní ukazuje do prčic.

edit:
tohle jsem našel v hlavičkových souborech gcc.

kód:
#if defined (_STDDEF_H) || defined (__need_NULL)
#undef NULL      /* in case <stdio.h> has defined it. */
#ifdef __GNUG__
#define NULL __null
#else   /* G++ */
#ifndef __cplusplus
#define NULL ((void *)0)
#else   /* C++ */
#define NULL 0
#endif  /* C++ */
#endif  /* G++ */
#endif   /* NULL not defined and <stddef.h> or need NULL.  */

_________________
Ball ball8;


Naposledy upravil bolejt dne 21. září 2009, 21:45:57, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 21. září 2009, 21:44:37    Předmět: Odpovědět s citátem

Mám pocit, že na nějakém compileru jsem se setkal s chováním, kdy 0 je 32bit číslo a NULL=0 je 64bit číslo na 64bit platformě, každopádně nula je furt nula. Wink
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna