2009-03-23 12 views
3

En cliquant sur un emplacement, je modifie le contenu de l'emplacement pour fournir le retour de l'utilisateur, puis appelle un code qui prend plusieurs secondes pour s'exécuter. Cependant, les modifications apportées à l'emplacement ne sont restituées qu'une fois le processus 'lent' terminé. Est-il possible que je puisse forcer le rendu avant que le code 'lent' s'exécute.Click Evénement dans Chaussures

Dans l'exemple suivant, l'utilisateur ne voit jamais « traitement, s'il vous plaît patienter ... »

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 

En regardant à travers le code source de chaussures dans ruby.c ou canvas.c il y a des références à une toile de repeindre ou de peinture . Sont-ils appelables de l'intérieur des chaussures?

Merci à l'avance

Répondre

2

Il est un peu hackish, mais vous pouvez déplacer la logique réelle dans une fonction séparée comme ceci:

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

    visit '/result' 
end 

Et utiliser timer pour l'exécuter dans un thread séparé:

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

    timer(0) { doStuff() } 
end 
2

Merci. Cela fonctionne un régal. J'ai également élaboré une solution en utilisant 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 

Les deux solutions semblent fonctionner comme prévu.