2012-11-01 344 views
0

當屏幕處於活動狀態時,我的應用程序正常工作,但屏幕鎖定或睡着時,某些代碼似乎無限期地暫停應用程序,而沒有遇到問題實際上是崩潰。Xcode在沒有崩潰的情況下停止運行

該應用使用AVAudioPlayers和boost :: threads播放一些音樂曲目。當曲目結束時,必須調用大量設置才能準備新曲目。與此同時,應用程序必須暫停幾秒鐘。這個並行活動是通過boost :: threads實現的。

當屏幕處於活動狀態時,這一切正常。但是,當屏幕處於非活動狀態時,不會播放新曲目。沒有崩潰,並且使用斷點進行調試,似乎應用程序只是掛在特定行上 - 行從調試會話變爲調試會話 - 並且被卡住了。從來沒有我希望有EXC_BAD_ACCESS - 但沒有任何東西。沒有暗示爲什麼代碼掛起。

難道是我的主線程被阻塞了嗎?我使用了一些performSelectorOnMainThread調用,但是當使用applicationWillResignActive鎖定屏幕時,我已經停用了它們。但是,這並沒有解決問題。

升壓::線程,它似乎掛如下:

void MyClass::loopThread(int waitSeconds) 
{ 
    loopScheduled = true; 

    sleep(waitSeconds); 

    if (loopScheduled == true) { 

     if (engine_isRunning()) { 
      joinEngineThread(); 
     } 
     startEngineThread(); 
     ((CPlusPlus*)m_obj)->markAsPlaying(); 
    } 
} 

似乎流連

if (loopScheduled == true) { 

線。

在這個線程中發生了什麼是其他並行線程可以在sleep()調用期間將loopScheduled設置爲false,並且如果loopScheduled爲false,則不會調用後面的方法。

但是,就我遇到的問題而言,loopScheduled應該是不相關的 - 它不會被任何其他方法設置爲false,並且在sleep()調用之後仍然是true。

有沒有人有任何想法會發生什麼?

+0

謝謝。由於問題的性質,很難知道要發佈什麼,因爲問題似乎在不同的地方出現。但是,我編輯了我的問題以包含代碼經常掛起的boost :: thread代碼。 – user1295558

回答

0

我發現了這個問題。音頻會話在應用在音軌之間暫停時結束。

事實證明,當屏幕被鎖定或睡着或者應用程序在後臺時,當最後一個AVAudioPlayer完成播放時,音頻會話結束。這意味着新的AVAudioPlayers不能再準備或播放 - 因此新曲目無法播放。

爲了解決這個問題,我現在正在音軌間暫停播放一個無聲文件。這使音頻會話繼續進行,這意味着新的音軌會在指示播放時播放。

+0

如果有人比靜默文件有更好的解決方案,我很樂意聽到它。 – user1295558

相關問題