超时 Timeouts

你也许想知道如何让 GTK 在gtk_main中做有用的工作。

你有几种选择。用下面的函数,你可以创建一个超时函数,每隔一段时间该函数被调用。

gint gtk_timeout_add( guint32     interval,
                      GtkFunction function,
                      gpointer    data );

参数:

  • interval
    该参数是以毫秒为单位的你的函数被调用的时间间隔。
  • function
    第二个参数是你想调用的函数。
  • data
    第三个参数是传递给回调函数的数据。返回值是一个整型的标记,该标记可以用于停止超时,用函数:

超时回调函数

void gtk_timeout_remove( gint tag );
你也可以通过从回调函数返回零或 FALSE 来停止超时函数。很显然,如果你想让你的函数继续被调用,应该返回一个非零值,如 TRUE。

回调函数应该声明为:

gint timeout_callback( gpointer data );

监控IO

GDK ( GTK 的底层库) 的一个极好的特性是能让它检查文件描述符 (如 open(2) 或 socket(2) 返回的) 上的数据。这对网络应用程序尤其有用。这个函数:

gint gdk_input_add( gint              source,
                    GdkInputCondition condition,
                    GdkInputFunction  function,
                    gpointer          data );

第一个参数是你想监控的文件描述符。
第二个参数指定你想让 GDK 寻找什么。它可以是:
GDK_INPUT_READ — 当文件描述符有数据可供读取时调用你的函数。
GDK_INPUT_WRITE — 当文件描述符做好写的准备时调用你的函数。

我确信你已经看出来了,第三个参数是当满足上述条件时你想要调用的函数,第四个参数是传递给该函数的参数。

返回值是一个标记,该标记可用于让 GDK 停止对文件描述符的监控,用函数:

void gdk_input_remove( gint tag );

回调函数应该声明为:

void input_callback( gpointer          data,
                     gint              source, 
                     GdkInputCondition condition );

source 和 condition 就是前述的参数。

Idle 函数

如果你想在程序空闲时调用一个函数怎么办?

gint gtk_idle_add( GtkFunction function,
gpointer data );
该函数让 GTK 在程序空闲时调用指定的函数。

void gtk_idle_remove( gint tag );
我不会解释各参数的意义,它们跟前面的差不多。第一个参数指向的函数会在任何机会出现时被调用。和其它函数一样,返回 FALSE 停止调用 idle 函数。