如何使用g_timeout_add?
How to use g_timeout_add?
我正在使用 GTK 和 Glade 在 C 中编写一个用于串行通信的程序。我在使用 g_timeout_add 时遇到问题。例如,我有一个函数 serial_data()
,它包含我的串行数据,我有一个按钮处理程序 on_update_button_clicked()
。所以到目前为止,我已经做到了,如果 update button
被点击,gtk_timeout
应该 运行。但它 运行 只用了一次。
on_update_button_clicked(GtkButton *Update_Button)
{
//2nd argument is serial_data function which contain actual data
g_timeout_add(250,serial_data,NULL);
}
我哪里漏掉了重点?
我还有一个按钮stop button
。所以我希望 timeout
应该在单击 stop button handler
时停止。怎么做呢??
再问一个问题,我想像计数器一样统计timeout
被运行ning的次数。这样我就可以显示计数器的数量。这怎么可能。?
请帮忙谢谢。
g_timeout_add()
returns 您应该存储的事件源 ID。您可以在停止按钮处理程序中使用带有该 ID 的 g_source_remove()
来停止超时。
查看开发者网站
https://developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html#g-timeout-add
它非常明确。
你可以从 gpointer
到 gboolean STOP
,在 return STOP
中完成 serial_data
功能,然后让你的 stop button
改变 [=15] =] 并且它将停止调用该函数。或类似的东西。
根据文档,该函数被重复调用,直到它 returns FALSE。您可以使用布尔参数调用 on_update_button
以切换持续调用超时调用,在参数计算结果为 TRUE
时将其设置为 运行,并使用 g_source_remove(threadID)
删除线程,如果参数是 FALSE
。这是一个演示:
// compiling with: gcc test.c `pkg-config --cflags gtk+-3.0` `pkg-config --libs gtk+-3.0` -o test
#include <stdio.h>
#include <gtk/gtk.h>
#include <glib/gi18n.h>
guint threadID = 0;
guint serial_counter = 0;
static gboolean
serial_data (gpointer user_data)
{
// do something
printf("counter: %d\n", serial_counter);
serial_counter++;
return user_data;
}
static void
on_update_button_clicked (GtkButton* button, gpointer user_data)
{
if (user_data == 1)
{
threadID = g_timeout_add(250, serial_data, user_data);
}
else if (user_data == 0)
{
g_source_remove(threadID);
threadID = 0;
}
}
int
main (int argc, char *argv[])
{
GtkWidget *window;
gtk_init (&argc, &argv);
GtkWidget *update_button;
GtkWidget *stop_button;
GtkWidget *box;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "test.c");
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
update_button = gtk_button_new_with_label (_("Update"));
stop_button = gtk_button_new_with_label (_("Stop"));
gtk_box_pack_start (GTK_BOX (box), update_button, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (box), stop_button, FALSE, FALSE, 0);
gtk_container_add (GTK_CONTAINER (window), box);
g_signal_connect (update_button, "clicked", G_CALLBACK (on_update_button_clicked), 1);
g_signal_connect (stop_button, "clicked", G_CALLBACK (on_update_button_clicked), 0);
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
gtk_widget_show_all (window);
gtk_main ();
return 0;
}
我正在使用 GTK 和 Glade 在 C 中编写一个用于串行通信的程序。我在使用 g_timeout_add 时遇到问题。例如,我有一个函数 serial_data()
,它包含我的串行数据,我有一个按钮处理程序 on_update_button_clicked()
。所以到目前为止,我已经做到了,如果 update button
被点击,gtk_timeout
应该 运行。但它 运行 只用了一次。
on_update_button_clicked(GtkButton *Update_Button)
{
//2nd argument is serial_data function which contain actual data
g_timeout_add(250,serial_data,NULL);
}
我哪里漏掉了重点?
我还有一个按钮stop button
。所以我希望 timeout
应该在单击 stop button handler
时停止。怎么做呢??
再问一个问题,我想像计数器一样统计timeout
被运行ning的次数。这样我就可以显示计数器的数量。这怎么可能。?
请帮忙谢谢。
g_timeout_add()
returns 您应该存储的事件源 ID。您可以在停止按钮处理程序中使用带有该 ID 的 g_source_remove()
来停止超时。
查看开发者网站
https://developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html#g-timeout-add
它非常明确。
你可以从 gpointer
到 gboolean STOP
,在 return STOP
中完成 serial_data
功能,然后让你的 stop button
改变 [=15] =] 并且它将停止调用该函数。或类似的东西。
根据文档,该函数被重复调用,直到它 returns FALSE。您可以使用布尔参数调用 on_update_button
以切换持续调用超时调用,在参数计算结果为 TRUE
时将其设置为 运行,并使用 g_source_remove(threadID)
删除线程,如果参数是 FALSE
。这是一个演示:
// compiling with: gcc test.c `pkg-config --cflags gtk+-3.0` `pkg-config --libs gtk+-3.0` -o test
#include <stdio.h>
#include <gtk/gtk.h>
#include <glib/gi18n.h>
guint threadID = 0;
guint serial_counter = 0;
static gboolean
serial_data (gpointer user_data)
{
// do something
printf("counter: %d\n", serial_counter);
serial_counter++;
return user_data;
}
static void
on_update_button_clicked (GtkButton* button, gpointer user_data)
{
if (user_data == 1)
{
threadID = g_timeout_add(250, serial_data, user_data);
}
else if (user_data == 0)
{
g_source_remove(threadID);
threadID = 0;
}
}
int
main (int argc, char *argv[])
{
GtkWidget *window;
gtk_init (&argc, &argv);
GtkWidget *update_button;
GtkWidget *stop_button;
GtkWidget *box;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW (window), "test.c");
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);
update_button = gtk_button_new_with_label (_("Update"));
stop_button = gtk_button_new_with_label (_("Stop"));
gtk_box_pack_start (GTK_BOX (box), update_button, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (box), stop_button, FALSE, FALSE, 0);
gtk_container_add (GTK_CONTAINER (window), box);
g_signal_connect (update_button, "clicked", G_CALLBACK (on_update_button_clicked), 1);
g_signal_connect (stop_button, "clicked", G_CALLBACK (on_update_button_clicked), 0);
g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
gtk_widget_show_all (window);
gtk_main ();
return 0;
}