2011-04-22 83 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()系統調用並導致它早日返回。那麼你的應用程序只需要適當地處理提前回報。根據您的實施情況,這可能不合適,但它可能會給您一個快速解決方案。

相關問題