C++我可以用什么代替睡眠()函数?

C++我可以用什么代替睡眠()函数?,c++,linux,timer,C++,Linux,Timer,我正在构建scrobbler,我希望我的程序在歌曲更改后等待10秒,然后再进行scrobbler。我一直在使用sleep,但我意识到,如果歌曲在这10秒内发生变化,程序会提交旧歌曲并获得新歌曲。我想如果我改变了歌曲,代码重新开始 我正在使用音乐播放器守护进程MPD和libmpd来获取歌曲的标签 注意:程序在Unix下。这在很大程度上取决于程序的工作方式,但原则上,最简单的方法是继续使用sleep,并在sleep恢复后发送数据之前检查用户是否更改了歌曲。因此,我们的目标不是让自己睡得更好,而是在发

我正在构建scrobbler,我希望我的程序在歌曲更改后等待10秒,然后再进行scrobbler。我一直在使用sleep,但我意识到,如果歌曲在这10秒内发生变化,程序会提交旧歌曲并获得新歌曲。我想如果我改变了歌曲,代码重新开始

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


注意:程序在Unix下。

这在很大程度上取决于程序的工作方式,但原则上,最简单的方法是继续使用sleep,并在sleep恢复后发送数据之前检查用户是否更改了歌曲。因此,我们的目标不是让自己睡得更好,而是在发送之前检查发送的数据是否真的有效


另一种可能是使用睡眠超时或更好的timerfd等待epoll,并通过eventfd通知歌曲更改。这样做的好处是,如果您需要可靠的线程间通信和就绪通知,那么它是免费的,您很可能会这样做。显然,您必须至少有一个额外的GUI线程,否则用户将无法在阻止时更改歌曲

达蒙的建议很好,可能是更好的总体设计。如果你正在寻找快速的东西,你可以考虑简单地在歌曲改变时向你的应用程序发送一个信号。这将中断睡眠系统调用并使其提前返回。然后,您的应用程序只需要适当地处理提前返回。根据您的实现情况,这可能不合适,但可能会给您一个快速解决方案。

您的程序如何识别歌曲已更改?如何拦截事件触发器?如果你使用一个可读取的事件,比如一个文件描述符,你可能可以用select设置一个超时,这意味着你可以同时处理10秒的暂停和观察状态变化,我敢肯定,一旦你听了一半的曲目,这些曲目应该被搜索到last.fm。@sftrabbit-不,这是我的项目。他们被搜索到我的网站。播放器是音乐播放器守护程序MPD,它是服务器。我的程序连接到MPD,当歌曲更改时,MPD会调用一个函数。该函数调用另一个函数来提取数据,然后调用第三个函数来发送数据。程序是控制台号GUI@CappY:没有服务器可以调用程序中的函数。因此,您的程序中有一个库,它有一个事件循环,并在从服务器获取数据时调用您的函数。由于您有事件循环,因此必须以与该事件循环兼容的方式等待。@CappY:将此注释添加到问题中,因为正确的解决方案取决于此信息。也要提到你使用的所有库。那么基本上你的程序是一个MPD客户机,并且运行在一个线程中?这意味着您要侦听来自MPD服务器的消息的套接字?你的代码现在看起来像这样?虽然退出{msg=recvmpd_socket,…;parse;usleep10000;sendscrobble_socket,…}@Damon:是的。我正在使用libmpd。