Приложение GTK зависает при создании дочернего процесса - PullRequest
0 голосов
/ 12 августа 2011

Я создаю GTK-приложение на C. Я создаю дочерний процесс, используя fork, а затем заменяю его execve ("crawler", arg, env); который сканирует мой домашний каталог и сохраняет все имена файлов в файле. Теперь этот дочерний процесс занимает некоторое время (около 2-5 минут). В то же время, когда этот дочерний процесс запущен, основная родительская программа GTK ожидает. Но когда дочерний процесс запущен, через некоторое время приложение GTK зависает.

Я пробовал gdk_thread_enter () / exit () в моей основной функции. Но все равно я приложение висит.

Пожалуйста, укажите на ошибку, если какие-либо или иные предложения по изменению.

Ответы [ 2 ]

1 голос
/ 13 августа 2011

Если вы подразумеваете под «когда этот дочерний процесс запущен, основная родительская программа GTK ожидает», означает, что ваш код выполняет wait (), waitid (), waitpid () в своем основномпотоком, тогда приложение действительно приостановит выполнение до тех пор, пока дочерний процесс не прекратится (если вы не выбрали опцию NOHANG).

Если вашему приложению Gtk не нужно дополнительно координировать свои действия с программой-поиском, просто используйте ранееупомянутая g_spawn_command_line_async подпрограмма, и не устанавливайте G_SPAWN_DO_NOT_REAP_CHILD.Если вам нужно координировать, вы можете установить этот флаг и создать источник GChildWatch или, возможно, использовать одну из подпрограмм канала g_spawn.

Как я интерпретирую gdk_thread_enter () / оставьте () , они блокируют или разблокируют потоки, а не запускают или останавливают новые потоки.Обратные вызовы Gtk выполняются в главном потоке, поэтому, как указано выше, блокирующий waitpid () в обратном вызове повесит приложение Gtk.Однако неблокирующая функция waitpid () в обратном вызове таймера (например) не является проблемой.

1 голос
/ 12 августа 2011

execve не создает дочерний процесс, он заменяет текущий процесс дочерним. Вы уверены, что сначала использовали fork (), а затем execve () внутри дочернего элемента?

EDIT , поскольку вы уже используете fork / execve, возможно, дочерний процесс все еще каким-то образом взаимодействует с Gtk. Лучше всего использовать специфичные для Glib / Gtk + функции для вызова сканера - попробуйте, например, g_spawn_command_line_async

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...