用于循环其他应用程序的GTK应用程序-冻结UI的问题

问题描述 投票:0回答:1

我的问题是for loop在GUI应用程序中的操作。我正在编写一个程序,通过单击run button(用于测试)打开其他程序,在运行期间我的UI开始挂起。如何使我的UI与另一个应用程序同时工作而不冻结?以便在for循环中所有元素都是可点击的]

main.c-gtk代码

#include <gtk/gtk.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

GtkWidget *window;
GtkWidget *run_button;
GtkWidget *stop_button;
GtkWidget *button_box;

int main(int argc, char **argv)
{
  gtk_init(&argc, &argv);

  window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER_ALWAYS);
  gtk_window_set_title(GTK_WINDOW(window), "Application - Launch GUI Tests");
  gtk_window_set_default_size(GTK_WINDOW(window), 600, 480);

  /* create button box - start / stop buttons */
  button_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
  gtk_box_set_homogeneous(GTK_BOX(button_box), TRUE);

  stop_button = gtk_button_new_with_label("Stop");
  run_button = gtk_button_new_with_label("Run");

  /* button box pack */
  gtk_box_pack_start(GTK_BOX(button_box), stop_button, FALSE, TRUE, 0);
  gtk_box_pack_start(GTK_BOX(button_box), run_button, FALSE, TRUE, 0);
  gtk_container_add(GTK_CONTAINER(window), button_box);

  /* signals */
  g_signal_connect(G_OBJECT(window), "destroy", gtk_main_quit, NULL);
  g_signal_connect(G_OBJECT(run_button), "clicked", G_CALLBACK(on_run_button_clicked), NULL);

  gtk_widget_show_all(window);
  gtk_main();

  return 0;
}

当我单击运行按钮时,此代码开始工作(如下)

void on_run_button_clicked(GtkWidget *run_button)
{
  char *list[] = {"xfce4-terminal", "gnome-application", "test-app", "firefox"};

  pid_t child;
  int status;

  for (int i = 0; *(list + i); i++) {
    switch(child = fork()) {
      case -1:
        perror("child - fork error");
        exit(EXIT_FAILURE);
      case 0: /* child process exec another program */
        execlp(list[i], list[i], NULL);
        exit(127);
      default: /* the parent waits until the program is closed */
        wait(&status);
        //check_status(status);
    }
  }
}

然后依次启动应用程序,直到用户关闭它们,但问题是主应用程序开始挂起,stop按钮不可用。如何解决?对我有帮助,请

c for-loop gtk fork exec
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.