运行多个并发 GMainLoop

2023-12-20

是否允许 GLib 用户运行多个GMainLoop实例在多个线程中同时运行,每个线程运行自己的实例?我到处都找到了“是”和“否”的答案。我意识到这个问题之前已经在这个论坛上被问过(2011 年 12 月) https://stackoverflow.com/questions/8529483/possible-to-run-multiple-main-loops.

但是,我可以运行两个GMainLoop同时出现多个实例,没有明显问题。我的测试代码非常简单:

  1. 创建一个GMainLoop in main()
  2. 使用以下命令为默认上下文和主循环创建超时源g_timeout_add
  3. 在main()中创建一个GThread
  4. 使用运行主循环g_main_loop_run
  5. [THREAD CONTEXT]:使用创建上下文g_main_context_new
  6. [THREAD CONTEXT]:使用以下命令将该上下文设置为线程默认值g_main_context_push_thread_default
  7. [THREAD CONTEXT]:使用创建循环g_main_loop_new并赋予它新的背景
  8. [THREAD CONTEXT]:创建超时源,并将其附加到新上下文g_source_attach.
  9. [THREAD_CONTEXT]:让线程调用g_main_loop_run

这样做,我看到了两个实例GMainLoop工作得很好。超时回调被正确调用,稍后对 g_main_loop_quit 的调用按预期工作。

所以,看起来拥有多个并不是问题GMainLoop实例同时工作。但也许我只是没有充分运用 API 来完全掌握情况。这个问题有确定的答案吗?

另外,如果有人愿意看的话,这里是实际的测试代码:

#define THREAD_TIMEOUTS (20)
#define MAIN_TIMEOUS (1)

typedef struct timeout_struct
{
    int i;
    int max;
    GMainLoop *loop;
    char *name;

} TIMEOUT_STRUCT;

gboolean timeout_callback(gpointer data)
{
    TIMEOUT_STRUCT *psTimeout = (TIMEOUT_STRUCT *)data;

    psTimeout->i++;

    if (psTimeout->i == psTimeout->max)
    {
        if (psTimeout->max == THREAD_TIMEOUTS)
        {
            g_main_loop_quit( (GMainLoop*)psTimeout->loop );
        }
        return FALSE;
    }

    return TRUE;
}
void* thread_function(void *data)
{
    GMainContext *ps_context;
    GMainLoop *ps_loop;
    GSource *ps_timer;
    TIMEOUT_STRUCT sTimeout;

    ps_context = g_main_context_new();
    g_main_context_push_thread_default(ps_context);

    ps_loop = g_main_loop_new(ps_context, FALSE);

    sTimeout.i = 0;
    sTimeout.max = THREAD_TIMEOUTS;
    sTimeout.loop = ps_loop;
    sTimeout.name = "thread";
    ps_timer = g_timeout_source_new_seconds(1);
    g_source_set_callback(ps_timer, timeout_callback, &sTimeout, NULL);
    g_source_attach(ps_timer, ps_context);

    g_main_loop_run(ps_loop);

    g_main_loop_quit( (GMainLoop*)data );

    return NULL;

}
/*
 * This main boots a thread, then starts up a GMainLoop.  Then the thread runs
 * a GMainLoop.  The thread sets a timer that fires ten times and the main sets a
 * timer that fires two times. The thread quits and
 * and then the other main l
 *
 *
 * */
int main()
{
    GThread *ps_thread;
    GMainLoop *loop;
    TIMEOUT_STRUCT sTimeout;

    loop = g_main_loop_new ( NULL , FALSE );

    sTimeout.i = 0;
    sTimeout.max = MAIN_TIMEOUS;
    sTimeout.loop = loop;
    sTimeout.name = "main";

    // add source to default context
    g_timeout_add (1 , timeout_callback, &sTimeout);

    ps_thread = g_thread_new("thread", thread_function, loop);

    g_main_loop_run (loop);
    g_main_loop_unref(loop);
}

《GTK+开发基础》一书这样说:

GLib 主循环被实现为多个结构,允许多个实例 要同时运行。

因此,考虑到这一点,我的测试代码和link https://stackoverflow.com/questions/11286284/g-timeout-add-inside-a-gthread我在上面的评论中发表了我们对这个问题的明确答案。

即:多个线程可能有自己的 GMainContext 和 GMainLoop,并且能够以并发方式独立运行这些循环。

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

运行多个并发 GMainLoop 的相关文章

  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • 如何使用 watin 中的 FileUploadDialogHandler 访问文件上传对话框

    我正在使用 IE8 和 watin 并尝试通过我的网页测试上传文件 我不能简单地使用 set 方法设置上传文件 例如 ie FileUpload Find ById someId Set C Desktop image jpg 因为上传文本
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • 私有模板函数

    我有一堂课 C h class C private template
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良

随机推荐

  • 使用终端,如何让 OS X 使用 PHP 的 MAMP 版本

    我目前正在学习 Yii 框架 昨天运行的教程之一要求我测试项目的数据库连接 这里的细节并不是太重要 但基本上当我运行 shell 并输入命令时 它会抛出如下错误 server trackstar charlieryan protected
  • Windows 服务的心跳活动

    我有许多 Windows 服务 用 C 4 0 编写 它们以不同的时间间隔连接到数据库并执行各种复杂的任务 其中一些任务每天仅每隔 X 小时发生一次 但是 服务器支持团队想知道 Windows 服务是否确实在运行 因为任务之间可能存在很大的
  • Logstash:是否可以将文档保存在内存中?

    我正在尝试将数据保存在内存中 以便能够在过滤器部分中快速检索 事实上 当我收到新文档时 我想检索以前的相关文档以计算一些新指标 谁能告诉我这是否可能 如果是 我怎样才能实现这一目标 非常感谢 Joe 实现这一目标最接近的方法是使用elast
  • 如何使用另一个表中的随机行更新表的每一行

    我正在构建我的第一个去识别脚本 但我的方法遇到了问题 我有一张桌子dbo pseudonyms whose firstname列填充有 200 行数据 此 200 行列中的每一行都有一个值 无空值 这个表还有一个id数字为 1 200 的列
  • React & Clarifai:未捕获的 ReferenceError:流程未定义

    我正在使用 Clarifai API 中的人脸检测模型构建一个 React 应用程序 当我import Clarifai from clarifai VS Code 提示我此警告 Could not find a declaration f
  • 如何使用python从gs存储桶中获取文件数量

    我想计算 gs 存储桶中的文件数量 该存储桶的文件夹名为我的文件管理器 假设项目名称为PrName存储桶名称是测试文件那么我如何使用 python 3 读取该存储桶中存在的文件数量 你可以使用方法 list blobs 在您的存储客户端上计
  • PHP自定义基于字符串出现次数的排序函数?

    假设我有一个数组 arr array Animal Dog Subject Physics Place Tokyo Sport Tennis 我想要usort具有以下标准 如果它包含tokyo排名第一 如果包含tennis排名第二 如果包含
  • JSON key 可以是字符串或对象

    我想解析一些 JSON 但其中一个键要么是字符串 要么是对象 这是我当前的结构 https github com PhillippOhlandt pmtoapib blob master CollectionItemRequest go L
  • 什么是 objc_msgSend 以及为什么它占用如此多的处理时间?

    我一直在分析我的回合制游戏应用程序 并且遇到了一个有趣的 也许 问题 根据下图 似乎objc msgSend占用了我的应用程序运行时间的近一分钟 这是什么 这是代码写得不好的标志吗 谢谢 正如 user1118321上面所说 objc ms
  • 在设计时设置复合 WF4 活动的内部属性

    我想创建一个复合 Windows 工作流活动 在 NET 4 下 其中包含预定义的 ReceiveAndSendReply 活动 有些属性是预定义的 但其他属性 特别是 ServiceContractName 需要在设计器中设置 我可以将其
  • 如何(正确)在 AWS Lambda 函数中使用外部凭证?

    我有一个用 Python 编写的 非常基本但工作完美 AWS lambda 函数 但是它具有要连接到的嵌入式凭据 1 外部网络服务 2 DynamoDB 表 该函数的作用相当基本 它针对服务发布登录信息 使用凭证 1 然后将部分响应状态保存
  • 有人可以解释一下这个 bash 命令吗?

    从网站上可以看到RVM https rvm io bash lt lt curl https rvm io releases rvm install head 第一个小于号有什么作用 关于 lt 我知道这是一个愚蠢的问题 但我很想了解这一点
  • 有关 XML 布局标签属性的 Android SDK 信息

    我正在研究 Android SKD 文档 我想知道在哪里可以找到有关定义应用程序界面布局时使用的 XML 标签属性的信息 例如安卓 名称 安卓 id class 片段标签的属性等 我在参考文档中找不到它们 该文档仅列出了 Java 类的文档
  • Django:ValueError:以 10 为基数的 int() 的文字无效:

    我正在尝试 django 中的一些东西 只是一个简单的表单 它将添加每次登录数据库的尝试 它导致 ValueError invalidliteral for int with base 10 我已经检查了很多问题 但无法克服此错误 我有这样
  • 真正的客户端 HTML 包括

    HTML 不支持客户端包含其他 HTML 例如使用 C 获取 include指示 相反 客户端 HTML 包含的主要工具似乎是iframe object 尤其是 jQuery 的 load See 这个线程 https stackoverf
  • 如何在HTML页面中播放视频

    我正在尝试在 HTML 页面上播放 mp4 视频 我搜索了网络并发现在 HTML5 中我可以使用video像下面这样的标签
  • 在 Clojure 中如何迭代直到达到固定点?

    我经常处于这样的位置 我的代码如下所示 iterate improve x 我正在寻找第一个值 该值不再比前一个值有所改进 两者都不filter nor take while帮助他们找到一个明显的解决方案 然而 我犹豫着要不要写出来 loo
  • mpld3:如何使用插件更改工具栏的位置?

    mpld3 显示的工具栏通常位于屏幕的右下角 我希望它位于屏幕的右上角 似乎可以找到控制工具栏位置的代码here https github com jakevdp mpld3 blob cec043807d18d788221455f1933
  • ElasticSearch - 使用 FilterBuilders

    我是 ElasticSearch 和 Couchbase 的新手 我正在构建一个示例 Java 应用程序来了解有关 ElasticSearch 和 Couchbase 的更多信息 正在阅读ElasticSearch Java API htt
  • 运行多个并发 GMainLoop

    是否允许 GLib 用户运行多个GMainLoop实例在多个线程中同时运行 每个线程运行自己的实例 我到处都找到了 是 和 否 的答案 我意识到这个问题之前已经在这个论坛上被问过 2011 年 12 月 https stackoverflo