У меня длительные операции, начатые с событием on-expose или после того, как пользователь нажал кнопку. Также у меня есть индикатор выполнения, который прекрасно работает, когда я пытаюсь обновить его состояние. Но когда я нажимаю кнопку, я вижу, как зависает мой графический интерфейс ...
<?php
abstract class FractalDrawingWindow extends GtkWindow {
public function FractalDrawingWindow() {
parent::__construct();
$this->set_title($this->getName());
$this->connect_simple('destroy', array('gtk', 'main_quit'));
$drawingArea = new GtkDrawingArea();
$drawingArea->connect('expose_event',array($this,'onExpose'));
$drawingArea->set_size_request(640,480);
$updateButton = new GtkButton('Update');
$updateButton->connect('clicked', array($this,'update'), $drawingArea);
$progress = new GtkProgressBar();
$vbox = new GtkVBox(false,0);
$vbox->pack_start($drawingArea,false,false,0);
$vbox->pack_start($progress, false, false, 0);
$vbox->pack_start($updateButton,false,false,0);
$this->add($vbox);
$this->set_position(GTK::WIN_POS_CENTER);
Gtk::timeout_add(200,array($this,'updateProgress'), $progress);
$this->show_all();
}
function onExpose($drawingArea, $event){
$context = $drawingArea->window->cairo_create();
$this->onDraw($context); // here I have a long ops wasting time...
}
function update($widget, $drawingArea){
$this->set_title($this->getName());
$drawingArea->queue_draw(); // after that onExpose event created
}
// simple update the progress
function updateProgress($progress){
$progress->set_fraction($this->getState());
return true;
}
abstract public function getName();
abstract public function getState();
abstract protected function onDraw($context);
}
?>
Итак, есть ли способ избежать замораживания и увидеть, как прогресс растет?