C 如何使用g_timeout_add?
我正在用GTK和Glade用C编写一个串行通信程序。我在使用g_timeout_add时遇到问题。例如,我有一个函数C 如何使用g_timeout_add?,c,button,timeout,gtk,C,Button,Timeout,Gtk,我正在用GTK和Glade用C编写一个串行通信程序。我在使用g_timeout_add时遇到问题。例如,我有一个函数serial\u data(),其中包含我的串行数据,我还有一个按钮处理程序,位于单击的按钮更新()。因此,到目前为止,我已经做了,如果点击update按钮,gtk_timeout应该运行。但它只运行了一次 on_update_button_clicked(GtkButton *Update_Button) { //2nd argument is serial_data
serial\u data()
,其中包含我的串行数据,我还有一个按钮处理程序,位于单击的按钮更新()。因此,到目前为止,我已经做了,如果点击update按钮
,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按钮处理程序时,timeout
应该停止。怎么做
还有一个问题要问,我想计算一下timeout
像计数器一样运行的次数。这样我可以显示计数器的编号。这怎么可能。?
请帮助,谢谢。g\u timeout\u add()
返回您应该存储的事件源id。您可以在停止按钮处理程序中使用带有该id的g\u source\u remove()
来停止超时。检查开发人员站点
这很明确
您可以将gpointer
设置为gboolean STOP
,在返回STOP
中完成串行数据
功能,并使停止按钮
更改停止=假
,它将停止调用该功能。或者类似的 从文档中,函数被反复调用,直到返回FALSE为止。您可以使用布尔参数在更新按钮上调用,以避免超时调用被连续调用,当参数的计算结果为TRUE
时将其设置为运行,如果参数为FALSE
,则使用g\u source\u remove(threadID)
删除线程。下面是一个演示:
// 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;
}
//编译时使用:gcc test.c`pkg config--cflags gtk+-3.0``pkg config--libs gtk+-3.0`-o test
#包括
#包括
#包括
guint-threadID=0;
吉尼特串行计数器=0;
静态gboolean
串行数据(gpointer用户数据)
{
//做点什么
printf(“计数器:%d\n”,串行计数器);
串行_计数器++;
返回用户数据;
}
静态空隙
在“更新”按钮上单击(GTK按钮*按钮,gpointer用户数据)
{
如果(用户_数据==1)
{
threadID=g_timeout_add(250,串行数据,用户数据);
}
else if(用户_数据==0)
{
g_源_移除(线程ID);
threadID=0;
}
}
int
main(int argc,char*argv[])
{
GtkWidget*窗口;
gtk_init(&argc,&argv);
GtkWidget*更新按钮;
GtkWidget*停止按钮;
GtkWidget*框;
窗口=gtk_窗口_新建(gtk_窗口_顶层);
gtk_window_set_标题(gtk_window(window),“test.c”);
长方体=gtk_长方体_新(gtk_方向_垂直,5);
更新按钮=带有标签的gtk按钮(更新);
stop_按钮=gtk_按钮_新按钮,带有_标签(u(“stop”));
gtk_盒_包_启动(gtk_盒(盒),更新_按钮,FALSE,FALSE,0);
gtk_-box_-pack_启动(gtk_-box(box),停止按钮,FALSE,FALSE,0);
gtk_容器添加(gtk_容器(窗口)、盒子);
g_信号连接(更新按钮,“点击”,g_回调(更新按钮上点击),1);
g_信号连接(停止按钮,“点击”,g_回调(更新按钮上点击),0);
g_信号连接(窗口,“销毁”,g_回调(gtk_主退出),空);
gtk_小部件_全部显示(窗口);
gtk_main();
返回0;
}
请每篇文章问一个问题。如何检查g_timeout_add()的id?我不确定我是否理解这个问题。您得到的值与任何函数返回值一样source\u id=g\u timeout\u add(250,timeout\u func,NULL)上面的代码>@jku没有回答OP的初始问题。如何使用g_timeout_add()。你知道怎么做了吗?然后回答或编辑OP的问题。这篇文章包含很多问题。。。如果问题有更多细节,我可能会回答得更详细——例如,它可能有实际的超时处理函数实现。没有这些细节,我甚至无法编辑OP的问题:我怎么知道他的代码中有什么问题?如果您有关于g_timeout_add()的特定问题,请将其作为新问题与示例代码一起发布。