Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
bolejt

Založen: 02. 05. 2009 Příspěvky: 45
|
Zaslal: 14. září 2009, 11:40:22 Předmět: neblokující vstup z konzole |
|
|
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...
nevěděl/neporadil by někdo něco? _________________ Ball ball8; |
|
Návrat nahoru |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 14. září 2009, 13:31:42 Předmět: |
|
|
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 14. září 2009, 13:40:18 Předmět: |
|
|
Na multiplatformní vlákna je dobrá knihovna openthreads, je hodně minimalistická. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 14. září 2009, 14:41:23 Předmět: |
|
|
poznam C funkciu kbhit(). mam ale pocit ze bude fungovat len na win. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
uiii
Založen: 12. 08. 2007 Příspěvky: 251
|
Zaslal: 14. září 2009, 15:34:21 Předmět: |
|
|
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 |
|
 |
backgen
Založen: 21. 08. 2009 Příspěvky: 11 Bydliště: Pribram
|
Zaslal: 14. září 2009, 16:23:17 Předmět: |
|
|
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 |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 14. září 2009, 16:37:16 Předmět: |
|
|
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 |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 14. září 2009, 16:40:32 Předmět: |
|
|
ale jinak otevri si v programu nejakej port a prikazy cekej na nem - pak je lze proste posilat telnetem a hotovson |
|
Návrat nahoru |
|
 |
bolejt

Založen: 02. 05. 2009 Příspěvky: 45
|
Zaslal: 14. září 2009, 19:41:26 Předmět: |
|
|
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.  _________________ Ball ball8; |
|
Návrat nahoru |
|
 |
Tringi

Založen: 28. 07. 2007 Příspěvky: 290
|
Zaslal: 15. září 2009, 00:13:00 Předmět: |
|
|
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 |
|
 |
Al
Založen: 23. 10. 2007 Příspěvky: 196
|
Zaslal: 21. září 2009, 21:05:13 Předmět: |
|
|
Jaky je rozdil mezi NULL a 0? Virius pise, ze zadny. |
|
Návrat nahoru |
|
 |
frca

Založen: 28. 07. 2007 Příspěvky: 1561
|
Zaslal: 21. září 2009, 21:14:32 Předmět: |
|
|
V C určitě žádný (až na to, že NULL nemusí být definovaný). _________________ www.FRANTICWARE.com |
|
Návrat nahoru |
|
 |
OndraSej

Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 21. září 2009, 21:38:01 Předmět: |
|
|
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  _________________ http://trionteam.net |
|
Návrat nahoru |
|
 |
bolejt

Založen: 02. 05. 2009 Příspěvky: 45
|
Zaslal: 21. září 2009, 21:40:08 Předmět: |
|
|
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.
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 |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 21. září 2009, 21:44:37 Předmět: |
|
|
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.  _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
|