3

スロットをクリックすると、スロットの内容を変更してユーザー フィードバックを提供し、実行に数秒かかるコードを呼び出します。ただし、スロットへの変更は、「遅い」プロセスが完了するまでレンダリングされません。「遅い」コードが実行される前に、強制的にレンダリングを行う方法はありますか?

次の例では、「処理中です。しばらくお待ちください...」というメッセージがユーザーに表示されることはありません。

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 に答える