2012-09-24 20 views
3

我想在Vala中制作一个守护进程,它只会每X秒执行一次任务。 我想知道这将是最好的方式:Vala中的高效守护进程

  1. Thread.usleep()或Posix.sleep()
  2. GLib.MainLoop + GLib.Timeout
  3. 其他?

我不希望它时,它什么都不做吃太多资源..

+0

出于好奇:如果cron无法处理它,这是什么样的任务? – Ancurio

+0

更换壁纸..我知道那里有很多壁纸更换器,但我想自己做一个,并想知道如何最好的方式。 – spinatelli

+0

嗯,我认为没有太大区别。无论如何,每个解决方案都可能会在某个时间或某个地方调用系统sleep(),所以我会选择一个timout,因为使用信号处理程序很方便。 – Ancurio

回答

5

如果你花时间在系统调用睡觉,有不会是从性能的角度任何明显差异。这就是说,它可能是有意义的使用主循环的方法有两个原因:

  1. 你将需要安装信号处理程序,这样,当它被赋予SIGTERM您的守护进程可以瞬间死亡。如果您通过Posix.signal绑定SIGTERM来在主循环中调用quit,那么这可能会比检查睡眠是否成功更具可读性。

  2. 如果您决定增加复杂性,MainLoop将使它更直接。

0

您可以使用GLib.Timeout.add_seconds方式如下:

Timeout.add_seconds (5000,() => { 
    /* Do what you want here */ 

    // Continue this "loop" every 5000 ms 
    return Source.CONTINUE; 

    // Or remove it 
    return Source.REMOVE; 
}, Priority.LOW); 

注意:因为它在后台运行,并应优先考虑其他任务的超时设置为Priority.LOW。

+1

对于这样的事情,您可能希望使用'GLib.Timeout .add_seconds',而不是'add',尤其是因为这个问题最初是针对性能问题的。 – nemequ

+0

@nemequ感谢您的信息,只是更新了示例;) – SkyzohKey