如何将C块与Gtk回调一起使用?
有没有办法在Gtk+回调中使用C块?我在调查这样的事情:如何将C块与Gtk回调一起使用?,c,gtk,glib,C,Gtk,Glib,有没有办法在Gtk+回调中使用C块?我在调查这样的事情: gboolean(^calledBack)(gpointer)=^gboolean(gpointer数据){ printf(“已触发回调!\n”); 返回FALSE; }; g_timeout_add(300,调用back,NULL); ANSI C没有任何阻塞功能。你是说Objective-C吗?在后一种情况下,答案是否定的,因为Gtk+是一个纯C框架。即使您不能直接将块传递到g\u timeout\u add,也很容易设置蹦床来为您执
gboolean(^calledBack)(gpointer)=^gboolean(gpointer数据){
printf(“已触发回调!\n”);
返回FALSE;
};
g_timeout_add(300,调用back,NULL);
ANSI C没有任何阻塞功能。你是说Objective-C吗?在后一种情况下,答案是否定的,因为Gtk+是一个纯C框架。即使您不能直接将块传递到g\u timeout\u add
,也很容易设置蹦床来为您执行此操作。下面是一个小测试程序,它使用块创建两个闭包,并将它们传递给g\u timeout\u 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;
}
…其中release_callback是一个实用函数,定义为:
static void release_callback(gpointer data) {
Block_release(data);
}
OP很可能意味着to C、C++、Objtovi.C的长度,表明不可能直接将块传递给
g\u timeout\u add
”,暗示你确实不能。谢谢你给出了详尽的回答。这似乎是一个解决办法。@ptomato啊,现在我明白我是如何误读了你的评论。谢谢你的澄清。
static void release_callback(gpointer data) {
Block_release(data);
}