Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
Loops 为单独的g_主循环添加回调_Loops_Glib - Fatal编程技术网

Loops 为单独的g_主循环添加回调

Loops 为单独的g_主循环添加回调,loops,glib,Loops,Glib,我对GMainLoop的工作原理有一些误解。 Main thing-将一些回调添加到g\u Main\u循环(如g\u timeout\u add\u seconds())的API不带指向要添加回调的循环的指针 看起来您为所有g\u main\u循环实例添加了回调。 即使您尚未创建。这方面的简单示例: #include <glib.h> gboolean callback(gpointer data) { static guint16 i=0; g_print("Iter

我对
GMainLoop
的工作原理有一些误解。 Main thing-将一些回调添加到
g\u Main\u循环
(如
g\u timeout\u add\u seconds()
)的API不带指向要添加回调的循环的指针

看起来您为所有
g\u main\u循环
实例添加了回调。 即使您尚未创建。这方面的简单示例:

#include <glib.h>

gboolean callback(gpointer data)
{
  static guint16 i=0; 
  g_print("Iter=%"G_GUINT16_FORMAT"\n",i++);
  if(i%5==0){
    g_print("try to stop loop1\n");
    g_main_loop_quit((GMainLoop*)data);
  }
  return TRUE;
}

int main()
{
  GMainLoop* loop1 = NULL;
  GMainLoop* loop2 = NULL;
  loop1 = g_main_loop_new (NULL, FALSE);

  g_timeout_add_seconds(1, callback,loop1);

  loop2 = g_main_loop_new (NULL, FALSE);
  g_print("run loop1\n");
  g_main_loop_run(loop1);
  g_free(loop1);
  g_print("run loop2\n");
  g_main_loop_run(loop2);
  g_free(loop2);
  return 0;
}

是否可以将
callback()
添加到
loop1
,而不将其添加到
loop2

这将使用在内部创建主循环源,并使用将其附加到主循环上下文。如果需要更好的控制,可以手动执行这些步骤

请注意,它表示它将源附加到主循环上下文——即a,而不是a。当您创建
GMainLoop
实例时,您正在为第一个参数传递
NULL
。根据该报告,这一论点是正确的

a(如果
NULL
,将使用默认上下文)

因此,您正在创建两个主循环,都使用相同的上下文(默认上下文)

要获得我认为您期望的结果,您应该做如下操作:

#包括
gboolean回调(gpointer数据)
{
静态电流16 i=0;
g_print(“Iter=%”g_GUINT16_格式“\n”,i++);
如果(i%5==0){
g_print(“尝试停止循环1\n”,数据);
g_主循环退出((Gmailoop*)数据);
}
返回TRUE;
}
int main()
{
GMainContext*con1=NULL;
GMainContext*con2=NULL;
GMainLoop*loop1=NULL;
GMainLoop*loop2=NULL;
GSource*source1=NULL;
con1=g_main_context_new();
con2=g_main_context_new();
loop1=g_main_loop_new(con1,FALSE);
loop2=g_主回路_新回路(con2,FALSE);
source1=g_超时_source_new_秒(1);
g_source_set_callback(source1,callback,loop1,NULL);
g_源_连接(源1,con1);
//我们不再需要文本,循环有一个内部
//参考资料,所以我们放弃我们的。
g_main_context_unref(con1);
con1=NULL;
//GSource也是如此
g_source_unref(source1);
source1=NULL;
g_main_context_unref(con2);
con2=NULL;
g_print(“运行循环1\n”);
g_主回路运行(回路1);
//使用g_main_loop_unref,而不是g_free
g_main_loop_unref(loop1);
loop1=NULL;
g_print(“运行循环2\n”);
//请注意,这里不再附加回调,因此它将
//永远跑。
g_主回路运行(回路2);
g_主回路_unref(回路2);
loop2=NULL;
返回0;
}
run loop1
Iter=0
Iter=1
Iter=2
Iter=3
Iter=4
try to stop loop1
run loop2
Iter=5
Iter=6
Iter=7
Iter=8
Iter=9
try to stop loop1
Segmentation fault (core dumped)