2015-03-22 2 views
0

Я использую RMagicK для Ruby для рисования и отображения изображений. Проблема в том, что после:RMagicK image.display не возвращается сразу

img = rvg.draw() 
img.diaplay 

контроль не возвращается вызывающему абоненту. Пользователь должен вручную закрыть окно для продолжения программы. Как я могу обойти это поведение?

ответ

1

Вы можете создать подпроцесс, который будет отображать изображение для вас, в то время как вы выполняете некоторую обработку в основном процессе.

img = rvg.draw() 
pid = fork { img.diaplay } 

Process.detach(pid) # wait for the child in another thread. 

# more code 

Обратите внимание, что вилка недоступна на некоторых платформах, таких как Windows. Возможно, вам придется использовать spawn, если это проблема для вас.

+0

Спасибо, это работает, но когда я жду 1 секунду, а затем попытаюсь убить его с помощью 'Process.kill (« QUIT », pid)' он не заканчивается. –

+0

@YanKingYin Теперь становится сложнее. Если я хорошо помню, 'img.display' будет использовать оконную систему подчеркивания для отображения изображения,' X11' на Linux или 'XQuartz' на Mac. Таким образом, оконная система может захватывать сигнал SIGQUIT. Одним из возможных решений может быть отправка сигнала, который нельзя поймать, например, SIGKILL или SIGSTOP. Кроме того, вы можете использовать «Timeout # timeout» в сочетании с 'Kernel # exit' для остановки дочернего процесса после исправить количество секунд. – yeyo

+0

Большое спасибо, 'SIGKILL' делает это :) –

Смежные вопросы