【问题标题】:Is it possible to have a parent process GTK application "contain" child process GTK windows?是否可以让父进程 GTK 应用程序“包含”子进程 GTK 窗口?
【发布时间】:2026-01-05 14:50:01
【问题描述】:

我有一个创建 3 个子进程的简单控制台应用程序:

#include <windows.h>
#include <stdio.h>
#include <tchar.h>


STARTUPINFO si[5];
PROCESS_INFORMATION pi[5];
int procIndex = 0;
void monitor_new_process();
void monitor_shutdown();

/**
 *
 * @see: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682512(v=vs.85).aspx
 */
void _tmain(int argc, TCHAR *argv[]) {
    monitor_new_process();
    monitor_new_process();
    monitor_new_process();
    monitor_shutdown();
}

void monitor_new_process() {
    ZeroMemory(&si[procIndex], sizeof(si[procIndex]));
    si[procIndex].cb = sizeof(si[procIndex]);
    ZeroMemory(&pi[procIndex], sizeof(pi[procIndex]));

    // Start the child process. 
    if (!CreateProcess(NULL,   // No module name (use command line)
        "consumer",        // Command line
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        0,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si[procIndex],            // Pointer to STARTUPINFO structure
        &pi[procIndex])           // Pointer to PROCESS_INFORMATION structure
        )
    {
        printf("CreateProcess failed (%d).\n", GetLastError());
        return;
    }

    procIndex++;
}

void monitor_shutdown() {
    while (procIndex >= 0){
        // Wait until child process exits.
        WaitForSingleObject(pi[procIndex].hProcess, INFINITE);

        // Close process and thread handles. 
        CloseHandle(pi[procIndex].hProcess);
        CloseHandle(pi[procIndex].hThread);
        procIndex--;
    }
}

我也一直在玩 GTK+。我制作了一个从 ui 文件生成窗口的简单应用程序:

#include <gtk/gtk.h>

GtkBuilder *builder;
GObject *window;
GObject *button;

int main(int argc, char *argv[])
{

    gtk_init(&argc, &argv);

    /* Construct a GtkBuilder instance and load our UI description */
    builder = gtk_builder_new();
    gtk_builder_add_from_file(builder, "builder.ui", NULL);

    /* Connect signal handlers to the constructed widgets. */
    window = gtk_builder_get_object(builder, "window");
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    gtk_main();

    return 0;
}

我想知道是否有一个 GTK+ 元素可以放入 builder.ui 文件中,它可以充当子进程的“容器”。

例如,我可以在构建器中有这样的东西:

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <requires lib="gtk+" version="2.24"/>
  <!-- interface-naming-policy project-wide -->
  <object class="GtkWindow" id="window1">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="title" translatable="yes">Test</property>
    <property name="window_position">center</property>
    <property name="default_width">440</property>
    <property name="default_height">250</property>
    <property name="destroy_with_parent">True</property>
    <child>
      <object class="GtkVBox" id="vbox1">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <child>
          <object class="GtkMenuBar" id="menubar1">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <child>
              <object class="GtkMenuItem" id="menuitem1">              
              <!- ... ->
              </object>
            </child>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <!-- SOME KIND OF CHILD PROCESS CONTAINER -->
        </child>
      </object>
    </child>
  </object>
</interface>

&lt;!-- SOME KIND OF CHILD PROCESS CONTAINER --&gt; 是一个带有 ID 的对象,我可以在其中嵌套来自子进程的 GTK+ 窗口。

类似的概念类似于 HTML 中的 iFrame —— 您可以在其中使用 HTML 指定一个框架,外部 Web 应用程序将在该框架中嵌套到父容器中。

另一个类似的概念是谷歌浏览器。 Chrome的shell是一个进程,每个tab都是一个子进程。这基本上正是我想要模仿的。

我需要在 GTK+ 和我的子进程脚本中做什么才能做到这一点? GTK 甚至可以做到这一点吗?

【问题讨论】:

    标签: c multiprocessing gtk3 inter-process-communicat


    【解决方案1】:

    是的,你可以。查看GtkSocketGtkPlug。不过,它们仅适用于 GTK 的 X11 后端,因此您的应用程序不会跨平台:具体而言,Windows 和本机 OSX 不支持此功能,Wayland 也不支持。

    【讨论】:

      最近更新 更多