5

我想在 Vala 中创建一个守护程序,它每 X 秒只执行一次任务。我想知道哪个是最好的方法:

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

我不想让它在什么都不做的时候吃掉太多的资源。。

4

2 回答 2

7

如果您将时间花在系统调用中,那么从性能角度来看不会有任何明显的差异。也就是说,使用 MainLoop 方法可能是有意义的,原因有两个:

  1. 您将需要设置信号处理程序,以便您的守护程序在收到 SIGTERM 时可以立即死亡。如果你通过绑定via 来调用quit你的主循环,那可能是一段比检查睡眠是否成功更易读的代码。SIGTERMPosix.signal

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

于 2012-09-24T13:28:17.193 回答
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,因为它在后台运行,应该优先考虑其他任务。

于 2016-03-21T19:26:03.967 回答