gpt4 book ai didi

C GTK+空闲函数运行一次

转载 作者:太空宇宙 更新时间:2023-11-04 04:13:51 24 4
gpt4 key购买 nike

我正在尝试编写一个 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); 并且函数必须返回一个 bool 值。

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

在调用者期望一个值并使用返回值时不返回值是未定义的行为。

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

你也有一个错误的类型转换:

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

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

关于C GTK+空闲函数运行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54146698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com