2011-04-22 85 views
4

我正在建立scrobbler,并且我希望我的节目在改变歌曲之前等待10秒钟,然后才开始写歌。我一直在使用睡眠,但我意识到,如果在这10秒内歌曲发生变化,节目将提交旧歌并获得新歌。我想要如果我改变歌曲,代码重新开始。C++我可以使用sleep()函数吗?

我正在使用音乐播放器守护进程(MPD)和libmpd来获取歌曲的标记。

注意:程序在Unix下。

+2

您的程序如何识别歌曲已被更改?你如何拦截事件触发器?如果你使用'read()' - 事件(即用一个文件描述符),你可以用'select()'设置一个超时时间,这意味着你可以同时处理10秒暂停和观察状态变化。 – chrisaycock 2011-04-22 09:52:51

+0

就像旁白一样,一旦你听完了一半的曲目,我很确定曲目应该被scrobbled为last.fm。 – 2011-04-22 10:54:46

+0

@sftrabbit - 不,这是我的项目。他们被拍到我的网站。 – CappY 2011-04-22 13:53:29

回答

2

它在很大程度上取决于您的程序是如何工作的,但原则上,最简单的方法是继续使用睡眠和检查用户在发送数据(睡眠返回后)之前是否更改了歌曲。因此,不是“尽量睡得更好”,而是“在发送之前检查您发送的数据是否真正有效”。

不同的可能性是等待epoll使用超时睡眠或更好的timerfd,并通过eventfd通知歌曲更改。这样做的好处是,如果您需要可靠的线程间通信和准备就绪通知,您很可能会这样做(显然,您必须至少有一个额外的GUI线程,否则用户将无法更改歌曲而你阻止)。

+0

那么播放器是音乐播放器守护进程(MPD)哪个是服务器。我的节目连接到MPD,当歌曲改变时,MPD调用该功能。该函数调用另一个函数来提取数据,然后调用第三个函数来发送数据。程序是控制台(无GUI) – CappY 2011-04-22 10:01:41

+0

@CappY:没有服务器可以在你的程序中调用函数。因此,程序中有一个库,它有一个事件循环并在从服务器获取数据时调用你的函数。既然你有事件循环,你必须以与事件循环兼容的方式等待。 – 2011-04-22 10:08:55

+0

@CappY:将此评论添加到问题中,因为正确的解决方案取决于此信息。提及你使用的所有库。 – 2011-04-22 10:10:38

1

达蒙的建议是一个很好的建议,可能是一个更好的整体设计。如果你正在寻找快速的东西,你可以考虑在歌曲改变时简单地向应用程序发送一个信号。这会中断sleep()系统调用并导致它早日返回。那么你的应用程序只需要适当地处理提前回报。根据您的实施情况,这可能不合适,但它可能会给您一个快速解决方案。

相关问题