Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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?

Předmět Autor Datum
konzola na toto neni stavana, ptz keby si pisal a sucasne vypisoval server, tak by ti to predsa mies…
MM.. 20.04.2014 12:26
MM..
keby si pisal a sucasne vypisoval server, tak by ti to predsa miesalo pismena z jedneho aj z druheho… poslední
Niko Bellic 20.04.2014 18:01
Niko Bellic
Nevím přesně :-), ale jak píše MM v DOSovské konzoli by to asi nešlo. V "normálním" programovacím pr…
Flash_Gordon 20.04.2014 12:33
Flash_Gordon
problem je ale konzola kedze pristupujes na nu z oboch vlaken tak musi byt thread safe, co konzola a…
MM.. 20.04.2014 13:14
MM..

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.

keby si pisal a sucasne vypisoval server, tak by ti to predsa miesalo pismena z jedneho aj z druheho

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.

Zpět do poradny Odpovědět na původní otázku Nahoru