我遇到了一个问题,当我的应用程序在屏幕处于活动状态时工作正常,但是,当屏幕被锁定或处于睡眠状态时,某些代码似乎会无限期暂停应用程序,而不会实际崩溃。 / p>
该应用程序使用AVAudioPlayers和boost :: threads来播放一些音乐曲目。当曲目结束时,必须调用许多设置才能准备新曲目。同时,应用程序必须暂停几秒钟。这个并行活动是通过boost :: threads实现的。
当屏幕处于活动状态时,一切正常。但是,当屏幕处于非活动状态时,永远不会播放新曲目。没有崩溃,并且,使用断点进行调试,似乎应用程序只是挂在某一行上 - 该行从调试会话更改为调试会话 - 并且卡住了。从来没有我如此希望EXC_BAD_ACCESS - 但没有什么。没有暗示代码挂起的原因。
可能是我的主线程被阻止了吗?我使用了一些performSelectorOnMainThread调用,但是当使用applicationWillResignActive锁定屏幕时,我已经停用了它们。但是,这还没有解决问题。
它似乎挂起的boost :: thread如下:
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()调用之后仍然是真的。
有没有人知道会发生什么事?
答案 0 :(得分:0)
我发现了问题。当应用程序在曲目之间暂停时,音频会话结束。
事实证明,当屏幕被锁定或睡眠或应用程序在后台时,当最后一个AVAudioPlayer完成播放时,音频会话结束。这意味着无法再准备或播放新的AVAudioPlayers - 因此无法播放新曲目。
为了解决这个问题,我现在正在播放音轨之间的静音文件。这样可以保持音频会话的进行,这意味着新曲目会在指示播放时播放。