我在玩音頻的背景,我想程序的控制保持靜止不動,直到音頻播放已經過去,我現在用的空while循環如下更好的方式來實現空while循環來保持控制
while(isPlaying==true){};
mediaPlayer.stop();
正如你所看到的while循環持有程序控制,直到音頻正在播放,然後執行下一條指令。這工作正常,但我開始知道,這不是一個正確的方法來做到這一點 - 而昂貴,我正在尋找替代品。請幫忙。
我在玩音頻的背景,我想程序的控制保持靜止不動,直到音頻播放已經過去,我現在用的空while循環如下更好的方式來實現空while循環來保持控制
while(isPlaying==true){};
mediaPlayer.stop();
正如你所看到的while循環持有程序控制,直到音頻正在播放,然後執行下一條指令。這工作正常,但我開始知道,這不是一個正確的方法來做到這一點 - 而昂貴,我正在尋找替代品。請幫忙。
假設你的程序是Java(...爲什麼你給它三個語言標籤?)你有幾個選項。你可以使用適當的同步事件,例如:
// fields
Object playerStopEvent = new Object();
boolean isPlaying;
// in your media player, when playback is complete:
synchronized (playerStopEvent) {
isPlaying = false;
playerStopEvent.notifyAll();
}
// elsewhere, when waiting for playback to complete:
synchronized (playerStopEvent) {
while (isPlaying) {
try {
playerStopEvent.wait();
} catch (InterruptedException x) {
// abort or ignore, up to you
}
}
}
mediaPlayer.stop();
參見Guarded Blocks官方教程更多的例子。
你也可以在mediaPlayer
完成時調用一些回調函數,例如在開始播放時禁用GUI組件,並在調用完成的回調時重新啓用它們(您也可以在此處使用事件監聽器方法)。
沒有更多的信息,我推薦後者,因爲它不會阻止你在玩家玩遊戲時做其他不相關的事情(或者保持你的程序無法響應),但前者可能更合適,取決於你的情況。
如果使用C或C++,則這個概念是相同的。使用第一個選項的任何等價的條件變量/事件,或者第二個任何等價的回調/聽衆/信號+插槽。
您可能會考慮sleep(time in milliseconds)
。這將允許您的線程在while循環中執行指定的毫秒休眠,然後再次檢查條件。
while(isPlaying==true)
{
Thread.currentThread().sleep(1000); // sleep for 1 sec
};
這一次是快,但更好的辦法是使用一些wait()
和notify()
機制,通過@JasonC在答覆建議。
+1,但一個微不足道的等待/通知會在沒有循環的情況下完成同樣的任務(或由於較長的睡眠時間導致延遲)。 –
@JasonC同意你的意見! – sakura
的第一件事是,你不必比較2種布爾類型,你在你的代碼做了...
while(isPlaying==true){};
,你可以這樣做..
while(isPlaying){};
和,現在你已經告訴你正在使用java,你可以試試這個...
while(isPlaying){
Thread.sleep(1);
};
@JasonC,我已經改變了我的代碼,因爲OP描述他正在使用Java。 –
簡單的方法是把sleep(1)放在while中。而且CPU使用率不會更高。
很好,在我的愚見,這是更好地使用另一種實現方式.. 嘗試使用線程,這樣就不會掛在那裏你的程序(這是一個背景聲音畢竟,你可能想要做別的事,而音頻播放)..
嘗試籤this page了..
你真的不需要{}
在空while loop
。
while(isPlaying);
就足夠了。
而且,正如其他人已經建議,可以考慮使用你的循環內的延遲,即
了Thread.sleep(100); //在Java中休眠的秒1/10
或者
延遲(100); //在Java中以1/10秒的速度流淌
那麼這是Java,C還是C++ ......? –
我在Java中實現..我認爲循環解決方案是通用的..我將刪除其他標籤 – DCoder
循環是,同步不是。 –