有没有办法在 Gtk+ 回调中使用 C 块?我正在研究这样的事情:
gboolean (^calledBack)(gpointer) = ^gboolean (gpointer data) {
printf("Callback fired!\n");
return FALSE;
};
g_timeout_add(300, calledBack, NULL);
即使您不能直接将块传递给g_timeout_add
,也可以轻松设置蹦床来为您完成。这是一个小测试程序,它使用块创建两个闭包并将它们传递给g_timeout_add
:
#include <glib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Block.h>
typedef gboolean (^callback_type)();
static gboolean trampoline(gpointer data) {
callback_type callback = data;
gboolean ret = callback();
Block_release(callback);
return ret;
}
void some_gtk_handler(int param)
{
gboolean (^callback)() = ^gboolean () {
printf("Callback fired: %d!\n", param);
return FALSE;
};
g_timeout_add(300, trampoline, Block_copy(callback));
}
int main()
{
GMainLoop *ml = g_main_loop_new(NULL, FALSE);
some_gtk_handler(0);
some_gtk_handler(42);
g_main_loop_run(ml);
return 0;
}
上面的代码指定了一个一次性处理程序,因此它可以释放蹦床中的块。如果您需要多次运行的块,请Block_release
从蹦床上删除对的调用,并使用g_timeout_add_full
销毁通知回调来安排它们:
g_timeout_add_full(G_PRIORITY_DEFAULT, 300, trampoline, Block_copy(callback),
release_callback);
...其中 release_callback 是一个实用函数,定义为:
static void release_callback(gpointer data) {
Block_release(data);
}
ANSI C 没有任何块功能。你是说Objective-C吗?在后一种情况下,答案是否定的,因为 Gtk+ 是一个纯 C 框架。