g_main_loop_unref(GMainLoop * loop)如何工作?

时间:2014-03-09 00:33:46

标签: glib

问题

摘自documentation

Decreases the reference count on a GMainLoop object by one. 
If the result is zero, free the loop and free all associated memory.

我找不到有关此参考计数器的信息。最初设定的是什么以及如何使用?

详情

特别是,我对这段示例代码感到困惑(在main方法中)(注意set_cancel是一个静态方法:

void (*old_sigint_handler)(int);

old_sigint_handler = signal (SIGINT, set_cancel);

 /* Create a new glib main loop */
 data.main_loop = g_main_loop_new (NULL, FALSE);

 old_sigint_handler = signal (SIGINT, set_cancel);

 /* Run the main loop */
 g_main_loop_run (data.main_loop);

 signal (SIGINT, old_sigint_handler);

 g_main_loop_unref (data.main_loop);

如果g_main_loop被阻止,它将如何停止?我也找不到有关此信号方法的信息。但这可能是图书馆的原生(虽然我不知道)。

注意:我将上面的代码简化为我认为必不可少的部分。它是来自docs / reference / aravis / html / ArvCamera.html下名为aravis的相机界面库

1 个答案:

答案 0 :(得分:4)

  

我找不到有关此参考计数器的信息。最初设定的是什么以及如何使用?

最初设置为1.每当存储对象的引用时,都会增加引用计数器,并且每当删除引用时,都会减少引用计数器。这是手动垃圾收集的一种形式。只是谷歌“引用计数”,你会得到很多信息。

  

如果g_main_loop被阻止,它将如何停止?

有人会打电话给g_main_loop_quit。从我猜测你不太熟悉事件循环概念的问题来看 - GLib的手册不是对基本概念的非常温和的介绍,你可能想尝试Wikipedia article或者只是搜索为“事件循环”。

  

我也找不到有关此信号方法的信息。但这可能是图书馆的原生(虽然我不知道)。

signal是标准函数(C和POSIX)。同样,有很多信息,包括好的旧手册页(man 2 signal)。