【发布时间】:2021-07-05 03:42:01
【问题描述】:
如果我想运行,比如说stty,它控制终端设置(例如逐个字符或逐行),最好的方法是什么。我想使用 GTK+ 工具。创建一个新线程,然后从该线程运行程序会更好......还是......?
【问题讨论】:
标签: multithreading gtk glib gdk gio
如果我想运行,比如说stty,它控制终端设置(例如逐个字符或逐行),最好的方法是什么。我想使用 GTK+ 工具。创建一个新线程,然后从该线程运行程序会更好......还是......?
【问题讨论】:
标签: multithreading gtk glib gdk gio
据我所知,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 fork 和 exec 函数的更方便的版本。它与进程的通信有限。在某些情况下,这正是您想要的,即运行一个不需要真正扫描其输出的程序。如需更高级的版本,请查看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_。这是最简单的,当您编写程序时,您会尽量保持简单。
【讨论】: