Нажмите событие в обувь - PullRequest
3 голосов
/ 23 марта 2009

При щелчке по слоту я изменяю содержимое слота, чтобы обеспечить обратную связь с пользователем, затем вызываю некоторый код, для запуска которого требуется несколько секунд. Однако изменения в слоте не отображаются, пока не завершится «медленный» процесс. Есть ли способ заставить рендеринг произойти до запуска «медленного» кода.

В следующем примере пользователь никогда не видит «Обрабатывается, пожалуйста, подождите ...» *

class MyTest < Shoes

  url '/', :index
  url '/result', :result

  def index
    stack do
      my_button=flow do
        image './assets/trees.jpg'
        para 'Process Image'
      end
      my_button.click do
        my_button.contents[0].hide
        my_button.contents[1].text="Processing, please wait ..."
        sleep(4) # Simulate slow process

        visit '/result'
      end
    end
  end
  def result
    stack do
      para "Finished processing"
    end
  end
end

Shoes.app

Просматривая исходный код Shoes в ruby.c или canvas.c, есть ссылки на перекрашивание или рисование холста. Они могут быть вызваны изнутри обуви?

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 24 марта 2009

Спасибо. Это работает удовольствие. Я также разработал решение с использованием потоков:

      def doStuff
         sleep(4) # Simulate slow process
         visit '/result'
      end

      .
      .
      .

      my_button=stack do 
         image  "button_image.jpg"
          para  "Press me"
      end
      my_button.click do
          Thread.new do
             doStuff
          end
           my_button.contents[0].hide
          my_button.contents[1].text = "Processing, please wait ..."
      end

Оба решения работают, как и ожидалось.

2 голосов
/ 23 марта 2009

Это довольно хакерски, но вы можете переместить реальную логику в отдельную функцию, например:

def doStuff()
  sleep(4) # Simulate slow process

  visit '/result'
end

И используйте timer, чтобы запустить его в отдельном потоке:

my_button.click do 
  my_button.contents[0].hide
  my_button.contents[1].text="Processing, please wait ..."

  timer(0) { doStuff() }
end
...