Sophie

Sophie

distrib > Mandriva > 2010.2 > x86_64 > by-pkgid > 49809f4e7890398acdc595e561edfff0 > files > 213

lib64gtk+-devel-1.2.10-51mdv2010.1.x86_64.rpm

<!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&agrave;.
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 &egrave; il numero di millisecondi tra le chiamate alla 
funzione. Il secondo &egrave; la funzione periodica, mentre il terzo
rappresenta i dati che vengono passati alla funzione. Il valore restituito
&egrave; un'etichetta che pu&ograve; 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&egrave; 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 &egrave; la possibilit&agrave; di fargli
controllare che siano verificate certe condizioni su un descrittore di file 
(come quelli restituiti da open(2) o socket(2)). Questo &egrave; utile in
particolar modo per le applicazioni di rete. La funzione &egrave; 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 &egrave; il descrittore che si desidera venga controllato,
mentre il secondo specifica quale condizione si vuole che GDK controlli.
Questa pu&ograve; 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 &egrave; 
pronto per la scrittura.
<P>Come sicuramente avrete gi&agrave; intuito, il terzo parametro &egrave; la
funzione da chiamare quando la condizione specificata &egrave; soddisfatta,
mentre il quarto rappresenta i dati da passare a questa funzione.
<P>Il valore di ritorno  &egrave; un etichetta che pu&ograve; 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&igrave;:
<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'&egrave;
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&agrave;; come 
negli altri casi, se essa restituisce FALSE non viene pi&ugrave; 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>