Я пытался сделать очень простое приложение PHP, используя php-gtk. Программа выполняет некоторую обработку и выводит статус этого процесса. Проблема в том, что приложение не запускается, пока процесс не завершится.
Я прочитал, что строка while (Gtk::events_pending()) {Gtk::main_iteration();}
позволяет продолжить основной цикл во время обработки, но он не работает для меня.
Вот код:
<?php
if(!class_exists('gtk')){
exit('php-gtk2!!');
}
$wnd = new GtkWindow();
$wnd->set_size_request(400, 200);
$wnd->set_title('test');
$wnd->connect_simple('destroy', array('gtk', 'main_quit'));
$lbl = new GtkLabel('1/3');
function processing($lbl){
while (Gtk::events_pending()) {Gtk::main_iteration();}
sleep(2);
$lbl->set_text('2/3');
sleep(2);
$lbl->set_text('3/3');
}
processing($lbl);
$wnd->add($lbl);
$wnd->show_all();
Gtk::main();
?>
Я пытался разместить эту строку везде в коде, и я не уверен, почему она не работает.
Любая помощь могла бы быть полезна. Заранее спасибо!
(Обратите внимание sleep
функция только для имитации какой-то тяжелой обработки)
Поскольку вы пытаетесь выполнять работу одновременно с работой вашего графического интерфейса, вам нужно будет использовать второй поток, связывающийся из этого потока с потоком графического интерфейса для получения обновлений графического интерфейса. Для этого используйте gdk_threads_add_idle()
или же g_idle_add()
функции. Не вызывайте функции GTK + напрямую из другого потока!
Других решений пока нет …