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