Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将C块与Gtk回调一起使用?_C_Gtk_Glib - Fatal编程技术网

如何将C块与Gtk回调一起使用?

如何将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,也很容易设置蹦床来为您执

有没有办法在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
,也很容易设置蹦床来为您执行此操作。下面是一个小测试程序,它使用块创建两个闭包,并将它们传递给
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的长度,表明不可能直接将块传递给 GyTimeOutAudioAd()/Cord>。@ pSigar博客帖子可以启动,同时可以通过构建小适配器函数来适应这些API使用块。每次你想用一个的时候都要这么做是很烦人的,尤其是因为每一个都有点不同。我的答案中的非泛型蹦床是一个“小适配器功能”的例子。我不是想暗示你原来的答案不正确,蹦床功能绝对是正确的!我只是在评论你的第一句话,“如果你不能直接将块传递给
g\u timeout\u add
”,暗示你确实不能。谢谢你给出了详尽的回答。这似乎是一个解决办法。@ptomato啊,现在我明白我是如何误读了你的评论。谢谢你的澄清。
static void release_callback(gpointer data) {
    Block_release(data);
}