为单独的 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 添加回调 的相关文章

  • 如果按下 Esc 则中断循环

    我用 JAVA 语言编写了一个程序 它使用 Scanner 类接受来自控制台的输入 现在我想将此功能添加到我的代码中 以便在用户按下 Esc 按钮时存在循环 while 到目前为止 我认为键盘类可以帮助我 但它就像扫描仪一样 我尝试使用事件
  • Linux shell 脚本中的 while 循环超时

    这工作正常 无限循环 while TRUE do printf done 我在尝试着timeout this while loop与timeout命令 所有这些都不起作用 timeout 5 while TRUE do printf don
  • 如何使用额外标记输出 wp_list_categories

    我目前正在使用下面的脚本在无序列表中输出我的所有 WordPress 类别 如何获得带有额外标记的输出 ul ul 例如 ul li Category 1 rsaquo li li Category 2 rsaquo li ul 代替 ul
  • 在matlab中不使用for循环检查数组中的成员资格

    我想简化这段代码 使其无需 for 循环即可工作 for i 1 N for j 1 N if ismember j A PID i i TFP i j PID i i end end end 其中A是一个包含一些标签的矩阵 我之前存储的T
  • jQuery / Ajax:如何循环遍历数组作为 Ajax 成功函数的一部分

    我有一个阿贾克斯调用返回一个数组并需要对该数组中的每个值执行某些操作 到目前为止 我有以下内容 但这会返回以下错误 Uncaught TypeError Cannot use in operator to search for length
  • Jquery:将链接标记为已访问而不打开它们?

    我无意仅仅更改链接 我听说这是不可能的 但如果不是 我很想知道如何更改 如果需要的话 我可以将其添加到浏览器历史记录中 我想遍历所有 a 位于页面上并将其状态更改为已访问 例如 a each function mark as visited
  • 循环浏览文件夹中的工作簿

    我正在尝试从文件夹中的所有工作簿复制某些单元格 下面的代码仅循环遍历第一个文件 VBA 新手 欢迎任何帮助 提前致谢 Sub Get Data Dim Directory As String Dim Filename As String D
  • 除了 gcc 之外,还有哪些编译器可以对代码进行向量化?

    GCC can 矢量化循环 ftp gcc gnu org pub gcc summit 2004 Autovectorization pdf当指定某些选项并给出正确的条件时 会自动进行 是否还有其他广泛可用的编译器可以执行相同的操作 IC
  • 如何从另一个数组值中过滤数组值并返回新数组? [复制]

    这个问题在这里已经有答案了 我有两个数组 all languages and taken languages 第一个包含所有语言 例如 200 种或其他语言 第二个包含之前选择的语言 从 0 到 200 种 我需要删除所有已采用的语言 ta
  • 使用自动热键中的热键切换键

    So I tried to automate running in a game where the map is huge and I have to run miles I wanted to toggle on the hotkey
  • 你将如何在 Haskell 中(重新)实现迭代?

    iterate a gt a gt a gt a 你可能知道 iterate是一个接受函数和起始值的函数 然后它将函数应用于起始值 然后将相同的函数应用于最后的结果 依此类推 Prelude gt take 5 iterate 2 2 2
  • do { ... } while (0) — 它有什么用? [复制]

    这个问题在这里已经有答案了 我已经看到这个表情十多年了 我一直在努力思考它有什么好处 因为我主要在 defines 中看到它 所以我认为它对于内部作用域变量声明和使用中断 而不是 gotos 很有用 对其他方面有好处吗 你用它吗 这是 C
  • Itertools 与嵌套循环性能

    我必须生成列表中所有两对项目组合 现在 我知道有两种方法可以实现这一点 嵌套 for 循环和 python 的内置迭代工具 from itertools import combinations foo 1 2 3 4 for i in xr
  • 如何循环遍历字典列表并打印特定键的值?

    我是 Python 新手 有一个问题 我知道这是一个非常简单的问题 运行Python 3 4 我有一个需要迭代并提取特定信息的列表 以下是列表 称为部分 的示例 已截断 数千个项目 state DEAD id phwl type name
  • 计算按前两列中的索引分组的 numpy 数组条目的第 N 列的总和?

    我想循环以下内容check matrix以这样的方式 代码可以识别第一个和第二个元素是否是1 and 1 or 1 and 2ETC 然后对于每个单独的类对 即1 1 or 1 2 or 2 2 代码应将最后一个元素 在本例中索引为 8 乘
  • matlab 中的 for 或 while 循环

    我刚刚开始在编程课的 matlab 中使用 for 循环 基本的东西对我来说很好 但是我被要求 使用循环创建一个 3 x 5 矩阵 其中每个元素的值是其行号其列号除以行号和列号之和的幂 例如元素 2 3 的值为 2 3 2 3 1 6 那么
  • php 打印 aa aaa ab aab 直到 zzz 的算法

    你好 我需要打印从 a 到 zzz 最多 3 个字母 例如我的输出应该是 A B Z AA AB AZ BA BB ZZ AAA AAB ZZZ 我在过去的 5 个小时里努力尝试 我找不到任何逻辑 我尝试了下面的代码 PHP 有一个方便的功
  • 使用 broom 和 tidyverse 对不同的因变量进行回归

    我正在寻找一个 Tidyverse 扫帚解决方案来解决这个难题 假设我有不同的 DV and a specificIVS 集 我想执行一个考虑每个 DV 和这组特定 IV 的回归 我知道我可以使用类似 for i in 或 apply fa
  • PostgreSQL:循环直到条件为真

    我正在尝试编写一个查询 该查询从指定值开始 循环 数据库 直到条件为真 例如 假设我在 TABLE 示例中有以下条目 id parent cond 1 True 2 1 False 3 1 False 4 2 False 我想要一个以 4
  • IEnumerable.比带中断的 for 循环更快吗?

    我们的代码打开表单时遇到了一些缓慢的情况 这可能是由于for循环与break这需要很长时间才能执行 我把它切换到IEnumerable Any 并看到表格很快打开 我现在试图弄清楚是否单独进行此更改会提高性能 或者是否正在访问Product

随机推荐

  • 尝试使用 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实例