Приложение GTK для зацикливания других приложений - проблема с зависанием пользовательского интерфейса - PullRequest
0 голосов
/ 27 мая 2020

Моя проблема - работа for loop с приложением GUI. Я пишу программу, которая открывает другие программы при нажатии на run button (для тестирования), во время запуска мой UI начинает зависать. Как заставить мой UI работать одновременно с другим приложением без зависаний? И чтобы все элементы были кликабельными во время for l oop

main. c - gtk code

#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 недоступна. Как это исправить? Помогите, пожалуйста

1 Ответ

0 голосов
/ 27 мая 2020

Похоже, что gtk_main() в main() не может выполнить свою задачу, потому что on_run_button_clicked() застрял в wait(). Вы должны убедиться, что on_run_button_clicked() действительно возвращается.

...