Newsgroup: it.comp.lang.c++
Titolo: stdio

come si fa a eliminare l'i/o bloccante?
cioč: far sě il programma esegua un ciclo di operazioni continuo, in cui
scriva alcune cose sullo schermo, e nel contempo riceva e analizzi tutti i
dati inseriti da tastiera senza interrompere l'esecuzione del programma.
si puň fare?
alex

Se non mi ricordo male in stdio.h non c'č niente del genere. Vedi la
funzione kbhit definita in conio.h
Dome

 Dome
o piu' semplicemente come si fa a creare 2 tread che dialogano tra di loro
???
questa e' pure una curiosita' mia ... :-p

 questa e' pure una curiosita' mia ... :-p
La creazione di threads non fa parte del linguaggio C++; devi affidarti al
sistema operativo.
Dal momento che la risposta cambia a seconda se tu lavori su windows, linux
o altro, ti consiglio di scrivere su di un NG specifico per la
programmazione sul tuo OS.
Con i thread ti ricordo pero' che devi stare attento, molti all'inizio
combinano guai ;-) (vedi critical sections e compagnia bella....)
Tommy

 funzione kbhit definita in conio.h
Che funziona solo in windows... ma cmq, _kbhit() ti  dice solo se un tasto
e' stato premuto o meno...
Tommy

 Tommy
Utilizzando il linguaggio C, sotto DOS, compilando con il DJGPP e usando le
librerie Allegro avevo usato le funzioni keypressed() e readkey().
Forse però non è il tuo caso......

 ???
Ma lascia perdere i thread... non ne vale la pena...
Dome

 e' stato premuto o meno...
Ok, ma si può facilmente adattare. Guarda qui:
<CODE>
#include <stdio.h>
#include <conio.h>
int main()
{
    int ch = 0;
    do
    {
        while( !kbhit() )
        {
            printf("Nothing...\n");
        }
        ch = getch();
        printf("Hai premuto il tasto %c (%d)\n", ch, ch);
    }while( ch != 27 );
    return 0;
}
</CODE>
Per la portabilità... ahimè, è vero: sotto *nix non esiste kbhit, ma penso
ci siano dei validi equivalenti. Questo funziona sotto Dos e Win32 (che non
è male comunque). Ad ogni modo è sempre più comodo che non andare a
scomodare i thread...
Dome

 scomodare i thread...
Se vuoi eliminare l`I/O bloccante, devi usare select() o poll(), o cmq
una funzione equivalente. E quindi devi gestire i descrittori, ti
ricordo che stdin == 0, stdout == 1 e stderr == 2.
Ovvio, se questo va contro le regole del C++, e in C++ c`e` un metodo
che piu` si confa` al linguaggio, il ng mi scusasse :)
Ciao
-- 
void

 Ok, ma si può facilmente adattare. Guarda qui:
si per prendere un tasto solo , grazie....
Tommy

 ha scritto nel messaggio
news:06gqa.67432$DT4.1...@twister1.libero.it...

e' che ho in cantiere un progetto di un interfaccia grafica per rpg online
con un sistema di protocollo proprietario e dovevo crearmi un tread in cui
gestisco tutto il traffico di rete e da li apro e gestisco le altre finestre
di dialogo del programma che devono essere separate e non bloccate una con
l'altra, soprattutto l'interfaccia del master che in casi limite dovrebbe
gestire n>> finestre per separare i dialoghi tra diverse sequenza di gioco.
quindi avevo pensato di creare il cuore del programma che gira in loop
nascosto alla vista e che gestisce le finestre via named pipe, ora spostero'
la domanda in qualche altro news cmq mi chiedevo pure se le named pipe era
il modo giusto per dialogare tra diversi tread o se e' meglio usare altri
metodi, che ne so tipo memcopy ...
vabbe fuggo con l'ot :-p

> si per prendere un tasto solo , grazie....
Cioč? Che vuoi dire?
Se vuoi piů tasti... allora dovrai usare i messaggi WM_CHAR e compagnia
bella di Windows...
Dome

 bella di Windows...
Per WM_CHAR devi avere una finestra ed una window-procedure che gestisca i
messaggi.... non e' per programmi console, o meglio non lo sarebbe, poi fai
quello che vuoi con fantasia...
WM_CHAR prende comunque un tasto alla volta, poi un tasto per volta fai
presto a prenderne tanti, ma ne prende cmq uno per volta...
Senti, facciamo un piacere al NG, chiudiamo questo thread che e' OT.
Tommy