2014-03-13 44 views
3

我在玩音頻的背景,我想程序的控制保持靜止不動,直到音頻播放已經過去,我現在用的空while循環如下更好的方式來實現空while循環來保持控制

while(isPlaying==true){}; 
mediaPlayer.stop(); 

正如你所看到的while循環持有程序控制,直到音頻正在播放,然後執行下一條指令。這工作正常,但我開始知道,這不是一個正確的方法來做到這一點 - 而昂貴,我正在尋找替代品。請幫忙。

+1

那麼這是Java,C還是C++ ......? –

+0

我在Java中實現..我認爲循環解決方案是通用的..我將刪除其他標籤 – DCoder

+0

循環是,同步不是。 –

回答

3

假設你的程序是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++,則這個概念是相同的。使用第一個選項的任何等價的條件變量/事件,或者第二個任何等價的回調/聽衆/信號+插槽。

1

您可能會考慮sleep(time in milliseconds)。這將允許您的線程在while循環中執行指定的毫秒休眠,然後再次檢查條件。

while(isPlaying==true) 
{ 
    Thread.currentThread().sleep(1000); // sleep for 1 sec 
}; 

這一次是快,但更好的辦法是使用一些wait()notify()機制,通過@JasonC在答覆建議。

+1

+1,但一個微不足道的等待/通知會在沒有循環的情況下完成同樣的任務(或由於較長的睡眠時間導致延遲)。 –

+0

@JasonC同意你的意見! – sakura

1

的第一件事是,你不必比較2種布爾類型,你在你的代碼做了...

while(isPlaying==true){}; 

,你可以這樣做..

while(isPlaying){}; 

和,現在你已經告訴你正在使用java,你可以試試這個...

while(isPlaying){ 
    Thread.sleep(1); 
}; 
+0

@JasonC,我已經改變了我的代碼,因爲OP描述他正在使用Java。 –

0

簡單的方法是把sleep(1)放在while中。而且CPU使用率不會更高。

2

很好,在我的愚見,這是更好地使用另一種實現方式.. 嘗試使用線程,這樣就不會掛在那裏你的程序(這是一個背景聲音畢竟,你可能想要做別的事,而音頻播放)..

嘗試籤this page了..

0

你真的不需要{}在空while loop

while(isPlaying);就足夠了。

而且,正如其他人已經建議,可以考慮使用你的循環內的延遲,即

了Thread.sleep(100); //在Java中休眠的秒1/10

或者

延遲(100); //在Java中以1/10秒的速度流淌

相關問題