为单独的 g_main_loop 添加回调

2023-11-21

我对如何做有一些误解GMainLoop工作。 主要的事情 - 添加一些回调的 APIg_main_loop (like g_timeout_add_seconds())不要将指针指向要添加该回调的循环。

看来您为所有人添加了回调g_main_loop实例。 即使您还没有创建。简单的例子:

#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;
}

结果是:

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)

是否可以添加callback() to loop1,并且不要将其添加到loop2?


快速浏览一下文档g_idle_add(), g_idle_add_full(), g_timeout_add(), or g_timeout_add_full()会告诉你:

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

请注意,它说它将源附加到主循环contexti.e., a GMainContext, not a GMainLoop。当您创建您的GMainLoop你正在传递的实例NULL对于第一个参数。根据the g_main_loop_new() documentation,这个论点是

a GMainContext (if NULL,将使用默认上下文)。

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

为了获得我认为您期望的结果,您应该执行以下操作:

#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", data);
    g_main_loop_quit((GMainLoop*)data);
  }
  return 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_main_loop_new (con2, FALSE);

  source1 = g_timeout_source_new_seconds (1);
  g_source_set_callback (source1, callback, loop1, NULL);
  g_source_attach (source1, con1);

  // We don't need the GMainContext anymore—the loop has an internal
  // reference so we'll drop ours.
  g_main_context_unref (con1);
  con1 = NULL;

  // Ditto for the GSource
  g_source_unref (source1);
  source1 = NULL;

  g_main_context_unref (con2);
  con2 = NULL;

  g_print("run loop1\n");
  g_main_loop_run(loop1);
  // Use g_main_loop_unref, not g_free
  g_main_loop_unref(loop1);
  loop1 = NULL;

  g_print("run loop2\n");
  // Note that there is no longer a callback attached here, so it will
  // run forever.
  g_main_loop_run(loop2);
  g_main_loop_unref(loop2);
  loop2 = NULL;

  return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为单独的 g_main_loop 添加回调 的相关文章

  • 浏览多个字段的值并将它们插入到同一列中

    我正在尝试使用重复行为我的 oracle apex 应用程序创建一个功能 假设我有一个车辆表 CREATE TABLE vehicles brand VARCHAR2 50 model VARCHAR2 50 comment VARCHAR
  • 每 30 秒运行一次 Laravel 方法

    我有一个在我调用应用程序上的特定 URL 时运行的方法 它处理数据库队列中的行 该间隔被设置为 Cron 可能的最小间隔 即 1分钟 这需要减少到 30 秒 所以我想知道如何最好地实现这一目标 我想我可以在我的脚本中构建一个循环 运行代码两
  • 如何使用break语句停止内部和外部循环[重复]

    这个问题在这里已经有答案了 我使用的代码非常简单break内部循环 for int it 0 it lt 5 it for int it2 0 it2 lt 5 it2 if it2 2 break break here not it2 b
  • for循环中更新JLabel的问题

    我的程序的想法是从之前在其他 JFrame 中保存的列表中选择一个名称 我想在标签中一个接一个地打印所有名称 它们之间有很小的延迟 然后停在其中一个名称上 问题是lbl setText String 如果有多个则不起作用setText co
  • 可以避免迭代元胞数组时的“s{1} 烦恼”吗?

    The s 1 标题的 烦恼 指的是下面的 for 块中的第一行 for s some cell array s s 1 unpeel the enclosing cell do stuff with s end This s s 1 业务
  • 计算按前两列中的索引分组的 numpy 数组条目的第 N 列的总和?

    我想循环以下内容check matrix以这样的方式 代码可以识别第一个和第二个元素是否是1 and 1 or 1 and 2ETC 然后对于每个单独的类对 即1 1 or 1 2 or 2 2 代码应将最后一个元素 在本例中索引为 8 乘
  • 循环 2 个列表,重复最短的列表,直到最长的列表结束 [重复]

    这个问题在这里已经有答案了 我确信有一种简单而明显的方法可以做到这一点 但我一直在谷歌搜索和阅读文档 但我找不到任何东西 这就是我想要实现的目标 la a1 a2 a3 a4 lb b1 b2 result a1 b1 a2 b2 a3 b
  • matlab 中的 for 或 while 循环

    我刚刚开始在编程课的 matlab 中使用 for 循环 基本的东西对我来说很好 但是我被要求 使用循环创建一个 3 x 5 矩阵 其中每个元素的值是其行号其列号除以行号和列号之和的幂 例如元素 2 3 的值为 2 3 2 3 1 6 那么
  • AS3 - for (... in ...) 与 for every (... in ...)

    以下代码执行完全相同的操作 之间有区别吗for each and for in var bar Array new Array 1 2 3 for var foo in bar trace foo for each var foo2 in
  • For 循环内的 For 循环 Javascript

    由于某种原因 该语句跳过了一些数据 我是否缺少一个 continue 语句某处或某事 这是代码 for var i 0 len data ORDER STATUS 0 ORDERS length i lt len i if data ORD
  • 如何在Python中循环并存储自变量中的值

    我对 python 很陌生 所以这听起来可能很愚蠢 我进行了搜索 但没有找到解决方案 我在 python 中有一个名为 ExcRng 的函数 我可以对该函数执行什么样的 for 循环 以便将值存储在独立变量中 我不想将它们存储在列表中 而是
  • 一次分配多个字段的聪明方法?

    由于遗留函数调用 我有时被迫编写像这样的丑陋的包装器 function return someWrapper someField a someField a b someField b and so on realistically it
  • 在 Bash 中从文本文件创建数组

    脚本采用 URL 解析它的所需字段 并将其输出重定向以保存在文件中 file txt 每次找到字段时 输出都会保存在新行中 file txt A Cat A Dog A Mouse etc 我要拿file txt并在新脚本中从中创建一个数组
  • 终止或中断java 8流循环[重复]

    这个问题在这里已经有答案了 我有一个包含以下内容的 java 8 流循环 void matchSellOrder Market market Order sellOrder System out println selling market
  • Scalaz 7 Iteratee 处理大型 zip 文件(OutOfMemoryError)

    我正在尝试使用 scalaz iteratee 包在恒定空间中处理大型 zip 文件 我需要对 zip 文件中的每个文件执行一个长时间运行的进程 这些进程可以 并且应该 并行运行 我创建了一个EnumeratorT使每个膨胀ZipEntry
  • C:从 char 数组打印会产生错误字符

    K N King s 的解决方案C 编程 现代方法 第二版 第 8 章 编程项目 14 产生不同的输出 包括正确的和错误的 示例如下所示 Reversal of sentence you can t swallow a cage can y
  • Python 多元简单线性回归

    注意这是not关于多元回归的问题 这是一个关于在 Python NumPy 2 7 中多次进行简单 单变量 回归的问题 我有两个m x n arrays x and y 这些行彼此对应 每对都是用于测量的 x y 点的集合 那是 plt p
  • 在这个使用泛型的初学者 java 示例程序中,“:”在做什么?

    好吧 我需要帮助理解一些事情 我理解 是如何一起使用的 但是阅读一些 Java 入门资料后 我发现这种情况在一些地方出现 最近的是这个 public static u void fillBoxes U u List u
  • 在循环中每次迭代开始时将变量重新分配给原始值(在循环之前定义)

    在Python中 你使用 在每次迭代开始时将变量重新分配给原始值 在循环之前定义 时 也就是说 original 1D o o o for i in range 0 3 new original 1D revert back to orig
  • 如何理解play2中的“Iteratee”?

    有一个包play api libs iteratee在play2中 有一个大物体Iteratee其中有超过1000行 为什么play2需要这么大的对象以及如何理解它 我刚刚写了一篇文章 试图向那些尝试发现 Play2 提供的 Iterate

随机推荐

  • 尝试使用 conn.Open() 时 C# MySQL SSL 连接错误

    在过去的三天里 我一直在努力解决 C 中 MySQL 连接器的问题 基本上 我按照 MySQLConnector 教程打开连接以发送数据 但是当我到达 MySQLConnection Open 方法时 我的代码抛出 SSL 连接错误 这是代
  • 释放未更改的“写时复制”内存

    我明白了写时复制背后的想法 当我分叉时 堆被标记为 CoW 当任何进程尝试更改它时 都会创建一个副本 问题是 我是否仍然必须在孩子的进程中释放它 假设父级有一个动态 char array 然后它会分叉 子进程打印一些 const char
  • Canvas 已通过本地 chrome:// 扩展 URL 被跨域数据污染

    我正在开发 google chrome 扩展程序 并尝试将与扩展程序捆绑在一起的图像加载到画布中 var canvas document createElement canvas canvas width 470 canvas height
  • SettingsClient 的位置请求始终为 RESULT_CANCELED

    在获取当前位置流时 我使用 SettingsClient 根据当前 LocationRequest 检查位置设置是否得到满足 目前 我的优先级设置为HIGH ACCURACY 这需要不惜一切代价启用GPS fusedLocationProv
  • Rstudio 中的“工具错误:::httpdPort <= 0L : ....”是什么意思?

    我已将 R 升级到版本 3 2 2 当我重新启动 Rstudio 时 在显示 gt 之前 出现错误消息 Error in tools httpdPort lt 0L comparison 4 is possible only for ato
  • NSAttributedString 中的 HTML 渲染速度非常慢

    我有 UITableView 和动态调整单元格大小 以 HTML 格式显示注释列表 但我遇到了 NSAttributedString 呈现 HTML 内容极其缓慢的问题 这是探查器的快照 我尝试将 NSAttributedString 初始
  • 在 O(n) 中运行的数组“最大差异”算法?

    给定一个由 N 个整数组成的数组 对数组进行排序 并找到排序后的数组中差值最大的 2 个连续数字 示例 输入 1 7 3 2 output 4 排序后的数组是 1 2 3 7 最大差值为 7 3 4 算法A运行于O NlogN time 我
  • 导航视图中的自定义菜单项大小和文本大小

    我正在使用代码来自定义导航视图中的文本高度和行高 它适用于 api21 但相同的代码在 api 16 中不起作用 我怎样才能使其工作 COde 创建一个样式并将其应用到 NavigationView 使用app theme 然后 使用 ap
  • 为什么 numpy/pandas 解析长行的 csv 文件如此慢?

    我试图有效地将每行 以及几千行 大约 20 000 个条目的 csv 文件解析为 numpy 数组 或数组列表 或任何类似的东西 我发现了许多其他问题 以及this博客文章 表明 pandas 的 csv 解析器非常快 然而 我对 pand
  • 如何调整 jQuery DatePicker 控件的大小

    我是第一次使用 jQuery DatePicker 控件 我已经让它在我的表单上运行了 但它大约是我想要的两倍大 大约是 jQuery UI 页面上的演示的 1 5 倍大 我缺少一些简单的设置来控制大小吗 Edit 我找到了一条线索 但它带
  • 如何在 TypeScript 中声明具有嵌套对象数组的对象?

    我有两节课都是这样的 class Stuff constructor things Thing name string class Thing constructor active boolean 我尝试在我的应用程序中声明一个字段 如下所
  • Sonata Admin Bundle:在列表视图上显示收藏总数

    有没有办法在列表视图上显示集合总数 想象一下 有一个用户可以拥有许多链接 如何在列表视图上显示总链接数 显示字段非常简单 有按此虚拟字段排序的解决方案 实体 Some php有关计数的更多信息请参见此处额外的惰性关联 public func
  • 在 jQuery UI 自动完成中使用 HTML

    Before jQuery用户界面1 8 4 我可以使用HTML在我为使用自动完成功能而构建的 JSON 数组中 我能够做类似的事情 row array label span style color red font family cour
  • 将多个 TensorFlow 数据集交错在一起

    当前的 TensorFlow 数据集交错功能基本上是一个交错平面地图 将单个数据集作为输入 考虑到当前的 API 将多个数据集交错在一起的最佳方法是什么 假设它们已经建成 并且我有一份清单 我想交替地从它们中生成元素 并且我想支持具有超过
  • 如何从 Powershell 运行 MSBuild 而不生成 msbuild.exe 进程?

    我正在考虑通过直接点击 MSBuild 程序集从 Powershell 脚本运行 MSBuild 而不是查找 MSBuild 安装路径并将 msbuild exe 作为子进程启动 有人这样做过吗 运行构建的最简单 最直接的方法是什么 您想指
  • .net core 3依赖注入服务作为“配置”的参数

    我刚刚将 net core 应用程序从版本 2 2 升级到 3 在startup cs 的ConfigureServices 方法中 我需要解析身份验证服务使用的服务 我正在使用 services BuildServiceProvider
  • Keycloak https auth页面无法访问

    我生成了自签名域证书 然后启动了Keycloak docker run name keycloak e KEYCLOAK ADMIN admin e KEYCLOAK ADMIN PASSWORD password e KC HTTPS C
  • 通过更改 C++ 内存来损坏计算机的风险

    我了解一些 Java 现在正在尝试 C 显然在 C 中 您可以执行诸如声明大小为 6 的 int 数组之类的操作 然后更改该数组的第 10 个元素 我理解它只是后面的第 4 个字节为 6 整数数组分配的内存部分的末尾 所以我的问题是 如果我
  • 计算字符串中每个字母的频率

    这是来自 pyschools 的问题 我确实做对了 但我猜会有一个更简单的方法 这是最简单的方法吗 def countLetters word letterdict for letter in word letterdict letter
  • 为单独的 g_main_loop 添加回调

    我对如何做有一些误解GMainLoop工作 主要的事情 添加一些回调的 APIg main loop like g timeout add seconds 不要将指针指向要添加该回调的循环 看来您为所有人添加了回调g main loop实例