2009-03-23 18 views
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 。彼らは靴の中から呼び出し可能ですか?事前に

おかげ

答えて

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 
2

ありがとうございます。それは治療に役立ちます。また、スレッドを使用したソリューションを試しました。

 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 

どちらのソリューションも期待どおりに動作しているようです。

関連する問題