2012-09-11 77 views
0

我一直在我的iPhone应用程序中使用Boost线程,并且偶然发现了一个问题。每当应用程序试图启动这样的线程时,每当尝试调用start_thread()时都会引发错误,并且应用程序崩溃。尝试启动Boost线程时出错

我真的不知道从哪里开始调试 - 从调试器中看不出来为什么boost线程无法初始化。应该注意的是,这只发生在应用程序运行一段时间后,并且在多个线程已经成功启动之后。

我最近一直工作在UI,并且我一直在使用下面的命令,以确保每一个更新的用户界面立即发生在被称为:

[myViewController performSelectorOnMainThread : @ selector(show_myButton) withObject:nil waitUntilDone:YES]; 

虽然该命令似乎工作,并立即更新UI(在它被延迟之前),我担心它可能会对我遇到的提升线程问题负责。这听起来可能吗?有没有人曾经遇到过这样的事情,并对可能出现什么问题有任何建议?

这里,是为了启动线程的代码:

void ObjectiveCPlusPlusInterface::startMyThread(void* a, myObject* b) 
{ 
boost::thread AVPlayerThread = boost::thread(&ObjectiveCPlusPlusInterface::myThreadFunction, this, a, b); 
} 

(其中一个& b是变量)

void ObjectiveCPlusPlusInterface::myThreadFunction(void* a, myObject* b) 
{ 
... 
} 

正如你所看到的,startMyThread()尝试启动升压线程,它执行功能myThreadFunction()。但是,未达到myThreadFunction(),因为启动boost线程会引发错误。

+0

你可以请发表包含创建线程的代码,直到加入它的点? (省略不相关的中间代码) –

+0

另外,看看[这个问题](http://stackoverflow.com/q/2109483/596781),你确定你在捕捉异常吗? –

+0

谢谢 - 我现在已经添加了代码。关于捕捉例外情况,不,我不确定我是否正在这样做 - 并且,在下面查看您的答案时,我不完全明白如何执行此操作。你能就此给我任何建议吗? – user1295558

回答

0

看着at the manual,我们看到构造函数boost::thread可以抛出一个异常。请确保您检查:

try 
{ 
    boost::thread AVPlayerThread(&ObjectiveCPlusPlusInterface::myThread, this, a, b); 

    AVPlayerThread.detach(); // or join()? 
} 
catch (boost::thread_resource_error const &) 
{ 
    // resource error (print a diagnostic!) 
} 
catch (...) 
{ 
    // some other exception (print a diagnostic!) 
} 

更新:你的编辑后,我看你不加入或分离线程!这是不允许的。

你可以把整个块放在你的startMyThread函数中。

+0

感谢您的支持。你能告诉我如何在我的代码中实现这个吗?我以前没有用过这样的东西。另外,我目前没有'join()'或'detach()'调用。我认为'join()'是否意味着主线程会等待boost线程返回?如果是这样,那不会为我的目的。 'detach()',那么,我应该用什么? – user1295558

+0

@ user1295558:正确,'join()'将阻塞,直到线程函数返回。 'detach()'将使线程无限期地运行。我已经更新了这篇文章,以便您能够将其直接粘贴到您的功能中。 –

+0

谢谢。我已经在线程初始化后将它分离出来,并且放入你推荐的catch。由于我做了这个改变,错误没有发生,但是,因为它只是偶尔发生,所以很难判断问题是否得到解决。我会继续测试,看看它是否会重现。您是否认为,在建议我拆线时,这可能是我的问题的解决方案? – user1295558

相关问题