我遇到了一个问题,即我的应用程序在屏幕处于活动状态时工作正常,但是,当屏幕被锁定或休眠时,某些代码似乎无限期地暂停了应用程序,而实际上并没有崩溃。
该应用程序使用 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() 调用之后仍然是 true。
有谁知道会发生什么?