2017-01-09 61 views
1

我想实现一个“类型开始搜索” - 像我的程序中的谷歌搜索功能。每种类型后,我的程序启动一个新的搜索线程并杀死旧的。Vala:如何异步等待x秒,然后执行一些操作然后

但是现在我想在搜索线程实际开始之前等待2秒。像这样的:

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 
} 

我想避免产卵到许多无用的线程。在Vala中这样做的最佳方式是什么?

+1

GtkSearchEntry已经有150毫秒的触发'搜索changed'的确切同样的原因,你想你的2S延迟我之前想象的内部延时。似乎没有办法调整延迟时间;我想你可以将它作为GNOME Bugzilla的功能请求吗? – andlabs

+1

为了其他目的,基于时间的迭代的方法是使用'GLib.Timeout.add()'。 – andlabs

+0

150毫秒的延迟对我的需求有点短。但超时似乎很有趣。 –

回答

1

感谢@andlabs! GLib.Timeout是关键字。对于解决方案在这里看到:

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; 
    } 
相关问题