Как избежать зависания графического интерфейса после запуска длинных операций - PullRequest
1 голос
/ 08 ноября 2019

У меня длительные операции, начатые с событием 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);
}
?>

Итак, есть ли способ избежать замораживания и увидеть, как прогресс растет?

...