<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <HTML> <HEAD> <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9"> <TITLE>GTK Tutorial: Funzioni periodiche, di I/O e di attesa</TITLE> <LINK HREF="gtk_tut_it-16.html" REL=next> <LINK HREF="gtk_tut_it-14.html" REL=previous> <LINK HREF="gtk_tut_it.html#toc15" REL=contents> </HEAD> <BODY BGCOLOR="#FFFFFF"> <A HREF="gtk_tut_it-16.html">Avanti</A> <A HREF="gtk_tut_it-14.html">Indietro</A> <A HREF="gtk_tut_it.html#toc15">Indice</A> <HR NOSHADE> <H2><A NAME="sec_timeouts"></A> <A NAME="s15">15. Funzioni periodiche, di I/O e di attesa</A></H2> <P> <H2><A NAME="ss15.1">15.1 Funzioni periodiche</A> </H2> <P>Probabilmente vi sarete chiesti come far fare qualcosa di utile a GTK durante la chiamata alla gtk_main(). Ci sono diverse possibilità. Usando le seguenti funzioni si possono creare funzioni che vengono chiamate periodicamente. <P> <BLOCKQUOTE><CODE> <PRE> gint gtk_timeout_add (guint32 interval, GtkFunction function, gpointer data); </PRE> </CODE></BLOCKQUOTE> <P>Il primo argomento è il numero di millisecondi tra le chiamate alla funzione. Il secondo è la funzione periodica, mentre il terzo rappresenta i dati che vengono passati alla funzione. Il valore restituito è un'etichetta che può essere utilizzata per fermare la chiamata periodica, passandolo alla funzione: <P> <BLOCKQUOTE><CODE> <PRE> void gtk_timeout_remove (gint tag); </PRE> </CODE></BLOCKQUOTE> <P>La chiamata periodica si ferma anche se la funzione periodica ritorna zero o FALSE. Naturalmente questo vuol dire che se si vuole che la funzione periodica continui ad essere richiamata, essa deve restituire un valore non nullo, cioè TRUE. <P>La dichiarazione della funzione periodica dovrebbe essere come questa: <P> <BLOCKQUOTE><CODE> <PRE> gint timeout_callback (gpointer data); </PRE> </CODE></BLOCKQUOTE> <P> <H2><A NAME="ss15.2">15.2 Controllo dell'I/O</A> </H2> <P>Un'altra utile caratteristica di GTK è la possibilità di fargli controllare che siano verificate certe condizioni su un descrittore di file (come quelli restituiti da open(2) o socket(2)). Questo è utile in particolar modo per le applicazioni di rete. La funzione è la seguente: <P> <BLOCKQUOTE><CODE> <PRE> gint gdk_input_add (gint source, GdkInputCondition condition, GdkInputFunction function, gpointer data); </PRE> </CODE></BLOCKQUOTE> <P>Il primo argomento è il descrittore che si desidera venga controllato, mentre il secondo specifica quale condizione si vuole che GDK controlli. Questa può essere una tra: <P>GDK_INPUT_READ - Chiama la funzione quando ci sono dati pronti per la lettura nel descrittore di file. <P>GDK_INPUT_WRITE - Chiama la funzione quando il descrittore di file è pronto per la scrittura. <P>Come sicuramente avrete già intuito, il terzo parametro è la funzione da chiamare quando la condizione specificata è soddisfatta, mentre il quarto rappresenta i dati da passare a questa funzione. <P>Il valore di ritorno è un etichetta che può essere usata per fermare il controllo di GDK sul descrittore di file, usando la seguente funzione: <P> <BLOCKQUOTE><CODE> <PRE> void gdk_input_remove (gint tag); </PRE> </CODE></BLOCKQUOTE> <P>La funzione da richiamare va dichiarata così: <P> <BLOCKQUOTE><CODE> <PRE> void input_callback (gpointer data, gint source, GdkInputCondition condition); </PRE> </CODE></BLOCKQUOTE> <P> <P> <H2><A NAME="ss15.3">15.3 Funzioni di attesa (``Idle'')</A> </H2> <P>Cosa fare se si ha una funzione che si vuole venga chiamata quando non sta accadendo nient'altro? <P> <BLOCKQUOTE><CODE> <PRE> gint gtk_idle_add (GtkFunction function, gpointer data); </PRE> </CODE></BLOCKQUOTE> <P>Questa fa si che GDK chiami la funzione specificata quando non c'è nessuna altra operazione in corso. <P> <BLOCKQUOTE><CODE> <PRE> void gtk_idle_remove (gint tag); </PRE> </CODE></BLOCKQUOTE> <P>Non ci soffermeremo sul significato dei parametri in quanto del tutto analoghi ai precedenti. La funzione puntata dal primo argomento della gtk_idle_add viene chiamata non appena se ne presenta l'opportunità; come negli altri casi, se essa restituisce FALSE non viene più chiamata. <P> <HR NOSHADE> <A HREF="gtk_tut_it-16.html">Avanti</A> <A HREF="gtk_tut_it-14.html">Indietro</A> <A HREF="gtk_tut_it.html#toc15">Indice</A> </BODY> </HTML>