我正在构建scrobbler,我希望我的程序在歌曲更换后等待10秒,然后再进行scrobbler。我一直在使用睡眠,但我意识到如果歌曲在这10秒内改变,程序会提交旧歌并获得新歌。我想如果我换了歌,代码又重新开始了。
我使用音乐播放器守护进程(MPD)和libmpd来获取歌曲的标签。
注:程序是Unix下的。
发布于 2011-04-22 17:58:44
这在很大程度上取决于你的程序是如何工作的,但原则上,最简单的方法是继续使用sleep和检查用户在发送数据之前(在睡眠恢复后)是否更改了歌曲。因此,不是“试着睡得更好”,而是“在发送之前检查你发送的数据是否真的有效”。
一种不同的可能性是使用休眠超时来等待epoll,或者更好地在timerfd上等待,并通过eventfd通知歌曲改变。这样做的好处是,如果您需要可靠的线程间通信和就绪通知,那么它是“免费的”,而您很可能需要这样做(显然,您必须至少有一个额外的GUI线程,否则当您阻塞时,用户将无法更换歌曲)。
发布于 2011-04-22 21:52:13
Damon的建议很好,而且可能是一个更好的整体设计。如果你正在寻找一些快速的东西,你可以考虑简单地在歌曲改变时发送一个信号给你的应用程序。这将中断sleep()系统调用并使其提前返回。然后,您的应用程序将只需要适当地处理早期返回。根据您的实现,这可能不合适,但它可能会给您一个快速修复。
https://stackoverflow.com/questions/5754239
复制相似问题