You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

g_timeout_add返回值始终为0且回调提前执行问题求助

问题分析与解决方案

你的代码里有个典型的函数指针使用错误,直接导致了这两个问题,让我一步步帮你修正:

问题根源

你在调用g_timeout_add时写了(GSourceFunc)fun()——这不是传递函数指针,而是立即执行了fun(),并把它的返回值(false,也就是0)强制转换成了函数指针类型。这就导致GLib收到的是一个NULL函数指针,所以触发了g_timeout_add_full: assertion 'function != NULL' failed的错误,返回的id自然是0,同时fun()也会被立即执行。

修正后的代码

#include <glib.h>

// 遵循GSourceFunc的签名:返回gboolean,参数为gpointer
gboolean fun(gpointer user_data) {
    g_print("函数在5秒后被调用了!\n");
    // 返回FALSE表示只执行一次,返回TRUE会每隔5秒重复执行
    return FALSE;
}

int main() {
    // 传递函数名(即函数指针),而不是调用函数
    guint id = g_timeout_add(5000, (GSourceFunc)fun, NULL);
    
    // 必须启动GLib的主事件循环,否则程序会直接退出,定时器无法触发
    GMainLoop *loop = g_main_loop_new(NULL, FALSE);
    g_main_loop_run(loop);
    
    return 0;
}

关键修正点

  • 传递函数指针而非调用函数:把fun()改成fun,这样传入的是函数的地址,GLib才能在指定时间后调用它。
  • 匹配函数签名:GSourceFunc要求函数返回gboolean类型(GLib定义的布尔类型,和C标准bool兼容,但更规范),参数为gpointer(通用指针类型)。
  • 启动主事件循环:GLib的定时器依赖主事件循环运行,没有它的话程序会直接结束,定时器永远不会触发。

这样修改后,你会得到有效的非0 id,fun()会在5秒后首次执行,完全符合你的需求。

内容的提问来源于stack exchange,提问作者user7163017

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:46:57