3

单击一个 slot 时,我会更改 slot 的内容以提供用户反馈,然后调用一些需要几秒钟才能运行的代码。但是,直到“慢”过程完成后,才会呈现对插槽的更改。有什么方法可以强制渲染在“慢”代码运行之前发生。

在以下示例中,用户永远不会看到“处理中,请稍候......”

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

查看 ruby​​.c 或 canvas.c 中的 Shoes 源代码,有对重新绘制或绘制画布的引用。它们可以从鞋子内部调用吗?

提前致谢

4

2 回答 2

2

这有点骇人听闻,但您可以将实际逻辑移动到一个单独的函数中,如下所示:

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
于 2009-03-23T14:03:30.050 回答
2

谢谢你。这是一种享受。我还使用 Threads 制定了解决方案:

      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

两种解决方案似乎都按预期工作。

于 2009-03-24T09:25:22.283 回答