
C++ vstup/výstup v jedné konzoli zároveň
Pěkný večer.
Potřeboval bych, aby aplikace (linuxová) komunikující se serverem vypisovala data, co server pošle a zároveň mohl uživatel zadávat příkazy a po stisknutí enteru odeslat. V podstatě stejně jako třeba telnet. Běžnou funkci pro vstup std::cin nemůžu použít, protože je blokující. Než by uživatel stiskl enter, program by nic nevypisoval. Napadlo mě, že bych proces forknul a původní proces by data vypisoval a potomek by četl ze stdin a odesílal. Přístup k socketu by měli samozřejmě přes nějaký mutex. Ale jde o tu konzoli. Co jsem zatím našel, tak od toho lidi odrazují. Že se to pak celé může chovat nepředvídatelně atp. Jaký by tedy byl vhodný způsob?
konzola na toto neni stavana, ptz keby si pisal a sucasne vypisoval server, tak by ti to predsa miesalo pismena z jedneho aj z druheho. Neviem jak linux konzola, nema to nejake kbhit() ze by si testoval ci bola stlacena klavesa pred volanim getch() ?
Normalne je ale konzolu robit tak jak ked rozpravas s niekym vysielackou, hovori jeden, potom povie "prijem" (= enter) a prepne sa smer a hovori druhy az po dalsi "prijem (enter) apod a tak na striedacku :)
Ak to ma byt simultanne tak asi by bolo lepsie urobit program s GUI s dvomi podoknami (jedno in a druhe out). Ale nepoznam linux konzolu takze konkrente na linux neporadim.
To by tolik nevadilo. Hlavně jestli by funkce cin nevzala pak celý obsah konzole, který vznikl před stiskem enteru. Měla by vzít jen to, co bylo skutečně napsáno na klávesnici. Aplikakce je jen pro účely testování (finální klient bude GUI, ale v požadavcích je udělat i čistě konzolového klienta).
Nevím přesně
, ale jak píše MM v DOSovské konzoli by to asi nešlo.
V "normálním" programovacím prostředí by se na to použily vlákna.
Hlavní vlákno by sloužilo pro zobrazení GUI a vkládání uživatelského vstupu.
Vedlejší vlákno by zase připisovalo do GUI.
Alespoň takto předpokládám fungují GUI messesingerů typu ICQ, Skype atd...
problem je ale konzola kedze pristupujes na nu z oboch vlaken tak musi byt thread safe, co konzola asi neni (miesali by sa tam pismena alebo co).
Normalne ked sa to urobi s GUI a viac podoknami tak sa to da riesit aj jednym vlaknom, tam je to fuk. Vlakna len zjednodusuju kod programu, ale neriesia problem ak nejaky zdielany prostriedok nevie korektne spracovavat simultanne veci z viac vlaken apod.