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
相关产品推荐
相关产品推荐

