Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用g_timeout_add?_C_Button_Timeout_Gtk - Fatal编程技术网

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

我正在用GTK和Glade用C编写一个串行通信程序。我在使用g_timeout_add时遇到问题。例如,我有一个函数
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()的特定问题,请将其作为新问题与示例代码一起发布。