gpt4 book ai didi

c - 如何将 C block 与 Gtk 回调一起使用?

转载 作者:行者123 更新时间:2023-12-02 01:57:23 25 4
gpt4 key购买 nike

有没有办法在 Gtk+ 回调中使用 C block ?我正在研究类似的东西:

gboolean (^calledBack)(gpointer) = ^gboolean (gpointer data) {
printf("Callback fired!\n");
return FALSE;
};

g_timeout_add(300, calledBack, NULL);

最佳答案

即使您不能将 block 直接传递给 g_timeout_add,也可以很容易地设置一个蹦床来为您做这件事。这是一个小测试程序,它使用 block 创建两个闭包并将它们传递给 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 。如果您需要多次运行的 block ,请从蹦床中删除对 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);
}

关于c - 如何将 C block 与 Gtk 回调一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19190669/

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