C GTK+ 空闲函数 运行 一次

C GTK+ idle function run once

我正在尝试编写一个 GUI 并打开和关闭 Raspberry Pi 3B+ 上的 LED。

我在 gtk 主循环和 运行 中添加了一个空闲函数,只有一次,计数器 (szamlalo) 没有增加。当我写:

printf("\r"); //?

后面szamlalo++一切正常。

有人知道吗?

我的完整代码:

#include <gtk/gtk.h>
#include <glib.h>
#include "EasyPIO.h"

GtkWidget *label;
unsigned int b=0;
unsigned int szamlalo = 0;



void idle()
{
    if(szamlalo > 100)
    {
        digitalWrite(2,!digitalRead(2));
        szamlalo = 0;
        printf("led\n\r");
    }
    else
    {
        szamlalo++;
        printf("\r"); //?
    }

}

int main(int argc, char *argv[])
{
    GtkBuilder  *builder;
    GtkWidget   *window;

    gtk_init(&argc, &argv);

    builder = gtk_builder_new();
    gtk_builder_add_from_file(builder, "ui.glade", NULL);

    window = GTK_WIDGET(gtk_builder_get_object(builder, "window"));
    gtk_builder_connect_signals(builder, NULL);

    pioInit();
    pinMode(2,OUTPUT);
    g_idle_add((void*)&idle,NULL);

    label = GTK_WIDGET(gtk_builder_get_object(builder, "cimke"));

    g_object_unref(builder);
    gtk_widget_show(window);

    gtk_main();

    return 0;
}

void bezaras()
{
    printf("kilépés\r\n");
    gtk_main_quit();
}

void btn_clicked()
{
    if(b==0)
    {
        gtk_label_set_text(GTK_LABEL(label), "ügyes vagy!");
        b=1;
    }
    else
    {
        b=0;
        gtk_label_set_text(GTK_LABEL(label), "de tényleg!");
    }

}

您调用了未定义的行为:

void idle()
{
...
}

根据 manual for g_idle_add 函数的签名必须是 gboolean (*GSourceFunc) (gpointer user_data); 并且函数必须 return 一个布尔值。

If the function returns FALSE it is automatically removed from the list of event sources and will not be called again.

没有 return 一个值,而调用者期望一个值并使用 return 值是未定义的行为。

如果您只是从函数中 return,您可能在用于 return 值的位置有一些 0 字节,这些值被视为 FALSE。在调用 printf 之后,您可能在该位置从 printf 获得了 return 值,当您打印 1 个字符时,该值为 1 而不是 FALSE 并且该函数被调用再次.

你的演员表也有误:

g_idle_add((void*)&idle,NULL);

类型void*兼容所有数据指针。您滥用它来强制调用错误的函数类型。 改用适当的功能并删除强制转换。如果您需要对函数类型进行强制转换,很可能是您使用该函数的方式出了问题。

让你成为国家volatile因为它可能被编译器优化掉了