【问题标题】:What GTK+ sub-process/threading/program execution/etc should I use if I want to launch a program from a GTK+ app?如果我想从 GTK+ 应用程序启动程序,我应该使用什么 GTK+ 子进程/线程/程序执行/等?
【发布时间】:2021-07-05 03:42:01
【问题描述】:

如果我想运行,比如说stty,它控制终端设置(例如逐个字符或逐行),最好的方法是什么。我想使用 GTK+ 工具。创建一个新线程,然后从该线程运行程序会更好......还是......?

【问题讨论】:

    标签: multithreading gtk glib gdk gio


    【解决方案1】:

    据我所知,GTK+ API 中有 7 个函数可以执行您列出的规范。其中 2 个是其中几个的子集。这是清单。

    g_spawn_
    g_thread_ 
    g_task_
    g_subprocess_
    gdk_threads_
    

    最后一个属于 GDK(Gimp Drawing Kit(为什么它有线程?)),其余属于 GIO 和 Glib。以下是g_thread_g_subprocess_ 的子集:

    g_thread_pool_
    g_subprocess_launcher_
    

    您未能在上述问题中确定您是否希望 stty 独立于应用程序运行,或者可以说是连接到应用程序。

    我现在将运行上面提到的所有功能,并解释它们的用途。与往常一样,请查看 GTK+ 文档以获取 API 参考信息。一个显示 GTK+ 文档的好程序是 devhelp。您可以通过在终端中输入来安装它:sudo apt install devhelp。 (Linux)

    g_spawn_ 是一个 Glib 函数,用作 UNIX forkexec 函数的更方便的版本。它与进程的通信有限。在某些情况下,这正是您想要的,即运行一个不需要真正扫描其输出的程序。如需更高级的版本,请查看g_subprocess_

    g_thread_ 也属于 Glib。 (子)进程和线程之间的区别在于线程共享相同的地址空间,而(子)进程则没有(它们有自己的内存)。使用线程很好,因为它们之间很容易进行通信,但你必须小心,否则会出现海森虫。此函数支持 mutex-es(复数),防止竞争条件。使用线程的程序示例是图像编辑器。一个线程处理鼠标移动,另一个处理效果的应用,另一个线程每分钟左右写入一次自动保存信息。

    g_thread_pool_g_thread_ 完全相同,只是它具有对许多线程的内置处理。如果用 GTK+ 编写,浏览器(例如 Chromium 或 Opera)将使用此功能。每个线程将处理一个选项卡,然后由一个主线程负责管理(销毁和创建等)子线程。

    g_task_ 表示要执行的任务。一般是异步的,但也可以是同步的。您调用g_task_new() 并假设它是异步的,调用包含g_task_new() 的函数的代码将恢复。您通过调用g_task_return_ 系列函数表明该任务已完成。然后调用回调函数,到此结束。这与一个单独的线程基本上具有相同的用途,当它被销毁时,会调用一个回调。

    g_subprocess_g_spawn_ 的更方便、更复杂的版本。它与 Glib 衍生产品相比的主要优势在于其异步 I/O 功能:您可以从一个子进程的输出中读取,并处理输出,然后发送到另一个进程的输入流,而不会阻塞主循环。 g_spawn_ 和其他 API 可以做到这一点,但难度更大。

    gdk_threads_ 本质上与 Glib 版本相同。唯一的区别在于单个数据结构实例的自动锁定。 g_thread_ 出于性能原因不这样做。但是您可以使用g_thread_ 手动锁定它们,而使用gdk_threads_ 它是自动完成的。但是因为g_thread_的文档比较多,还是用起来比较好。

    因此,您的问题的答案是使用g_spawn_。这是最简单的,当您编写程序时,您会尽量保持简单。

    【讨论】:

    • 你为什么用第二人称回答你自己的问题?这个答案是从其他地方的其他人给你的答案复制而来的吗?如果是这样,那么称赞他们是有礼貌的。
    • 不,我自己想出了这一切,并使用 GTK+ 文档。
    • 我用了第二个人,因为我不知道该用什么人。你有什么建议:第一人称?
    • 是的,明确说明您是在进行进一步研究的基础上回答您自己的问题,这有助于使事情更清楚:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 2020-11-28
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多