C语言 如何使用g_timeout_add



我正在用 GTK 和 Glade 用 C 语言制作一个用于串行通信的程序。我在使用g_timeout_add时遇到问题。例如,我有一个包含我的串行数据的函数serial_data(),我有一个按钮处理程序on_update_button_clicked()。所以到目前为止,我已经这样做了,如果单击update buttongtk_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像计数器一样运行的次数。这样我就可以显示计数器的数量。这怎么可能。?请帮忙谢谢。

从文档中, 该函数被反复调用,直到它返回 FALSE。您可以使用布尔参数调用on_update_button以切换超时调用,使其在参数计算结果为 TRUE 时设置为运行,如果参数FALSE,则使用 g_source_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: %dn", 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;
}

g_timeout_add()返回应存储的事件源 ID。您可以在停止按钮处理程序中使用具有该 id 的g_source_remove()来停止超时。

检查开发者网站

https://developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html#g-timeout-add

它非常明确。

您可以对gboolean STOP进行gpointer,在return STOP中完成serial_data函数,并stop button更改该STOP = FALSE,它将停止调用该函数。或类似的东西。

相关内容

  • 没有找到相关文章