如果我想从 GTK+ 应用程序启动程序,我应该使用什么 GTK+ sub-process/threading/program execution/etc?

What GTK+ sub-process/threading/program execution/etc should I use if I want to launch a program from a GTK+ app?

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

据我所知,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 函数的更方便的版本。它与进程的通信有限。在某些情况下,这就是您想要的,即 运行ning 一个实际上不必扫描其输出的程序。如需更高级的版本,请查看 g_subprocess_.

g_thread_ 也属于 Glib。 (子)进程和线程之间的区别在于线程共享相同的地址space,而(子)进程则没有(它们有自己的内存)。使用线程很好,因为它们之间的通信非常容易,但你必须小心,否则会出现 Heisenbugs。此函数支持 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 spawning 的主要优势是它的异步能力 I/O:你可以从一个子进程的输出中读取,处理输出,然后发送到另一个进程的输入流,而不会阻塞主循环.这对于 g_spawn_ 和其他 API 是可能的,但更困难。

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

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