Xcode在没有崩溃的情况下停止运行

时间:2012-11-01 17:45:28

标签: xcode multithreading

我遇到了一个问题,当我的应用程序在屏幕处于活动状态时工作正常,但是,当屏幕被锁定或处于睡眠状态时,某些代码似乎会无限期暂停应用程序,而不会实际崩溃。 / 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()调用之后仍然是真的。

有没有人知道会发生什么事?

1 个答案:

答案 0 :(得分:0)

我发现了问题。当应用程序在曲目之间暂停时,音频会话结束。

事实证明,当屏幕被锁定或睡眠或应用程序在后台时,当最后一个AVAudioPlayer完成播放时,音频会话结束。这意味着无法再准备或播放新的AVAudioPlayers - 因此无法播放新曲目。

为了解决这个问题,我现在正在播放音轨之间的静音文件。这样可以保持音频会话的进行,这意味着新曲目会在指示播放时播放。