2017-01-09 3 views
1

Ich möchte ein "Typ, um Suche" -Funktion wie die Google-Suche in meinem Programm zu implementieren. Nach jedem Typ startet mein Programm einen neuen Suchthread und tötet den alten.Vala: Wie asynchron auf x Sekunden warten und etwas dann ausführen

Aber jetzt möchte ich zum Beispiel 2 Sekunden warten, bevor der Such-Thread tatsächlich startet. Etwas wie dieses:

Countdown countdown = new Countdown(); 
countdown.set_action_after_x_secons(2sec, do_search); 


private void SearchEntry_search_changed(){ 
    countdown.reset_time(); //resets time to 2 seconds again 
    actual_search = SearchEntry.get_text(); 
} 

private void do_search(){ 
// actual search here 
} 

Ich möchte vermeiden, zu vielen nutzlosen Threads zu spawnen. Was ist der beste Weg, dies in Vala zu tun?

+1

GtkSearchEntry hat bereits eine interne Verzögerung von 150ms vor dem Auslösen 'search-changed' für den exakt gleichen Grund, warum ich denke, Sie Ihre 2s Verzögerung mögen. Es scheint keine Möglichkeit zu geben, die Verzögerungszeit einzustellen; Ich denke, Sie können dies als Feature-Anfrage auf dem GNOME Bugzilla fragen? – andlabs

+1

Für andere Zwecke ist der Weg zur zeitbasierten Iteration mit 'GLib.Timeout.add()'. – andlabs

+0

Die Verzögerung von 150 ms ist für meine Bedürfnisse etwas kurz. Aber Timeout scheint interessant zu sein. –

Antwort

1

Dank @andlabs! GLib.Timeout war das Schlüsselwort. siehe Lösung hier:

private int search_delay = 1000; 
    private uint delayed_changed_id; 

    public void search(string txt){ 
     search_text = txt; 
     reset_timeout(); 
    } 

    private void reset_timeout(){ 
     if(delayed_changed_id > 0) 
      Source.remove(delayed_changed_id); 
     delayed_changed_id = Timeout.add(search_delay, timeout); 
    } 

    private bool timeout(){ 
     // do actual search here! 

     delayed_changed_id = 0; 

     return false; 
    } 
Verwandte Themen