2009-03-23 4 views
3

Beim Klicken auf einen Steckplatz ändere ich den Inhalt des Steckplatzes, um Benutzerfeedback bereitzustellen, und rufe dann Code auf, der einige Sekunden zum Ausführen benötigt. Die Änderungen am Slot werden jedoch erst nach Abschluss des 'langsamen' Prozesses ausgeführt. Gibt es eine Möglichkeit, das Rendering zu erzwingen, bevor der "langsame" Code ausgeführt wird?Event in Schuhe klicken

Im folgenden Beispiel sieht der Benutzer nie ‚Verarbeitung, bitte warten ...‘

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 

Blick durch Code-Schuhe Quelle in ruby.c oder canvas.c gibt es Hinweise auf einen Repaint oder Farbe Leinwand . Sind sie in Schuhen abrufbar?

Vielen Dank im Voraus

Antwort

2

Es ist irgendwie hackish, aber man kann die eigentliche Logik in eine separate Funktion wie folgt bewegen:

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

    visit '/result' 
end 

Und timer verwenden Sie es in einem separaten Thread ausführen:

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

    timer(0) { doStuff() } 
end 
2

Vielen Dank. Das ist ein Vergnügen. Ich habe auch eine Lösung mit Threads ausgearbeitet:

Beide Lösungen scheinen zu funktionieren wie erwartet.