查看: 2715|回复: 8

请教array 为什么2.6版本下多线程显示文字出错??

[复制链接]

该用户从未签到

发表于 2008-9-8 10:34:39 | 显示全部楼层 |阅读模式
在osg2.6版本下运行例子程序osgText程序
为什了在多线程添加文字时会出现错误?
在2.4版本下就可以正常运行。
好像是线程的问题,但是有找不到具体原因。
多谢了
error.jpg

该用户从未签到

发表于 2008-9-8 12:07:56 | 显示全部楼层
这个例子您有什么改动吗,我这里加上--mt运行好像没有什么问题?

图中的运行时错误提示在多线程渲染时还是很常见的,不过出错原因却很难说清楚。
您可以尝试使用setThreadingModel设置不同的线程模式试一下,如果有哪个线程模式下的运行确实有错的话,不妨结合自己的硬件配置,大家再作讨论~~

该用户从未签到

 楼主| 发表于 2008-9-8 14:18:02 | 显示全部楼层

回复 2楼 的帖子

错误也不是一直有的。
偶尔不出现。
我设置了3个线程。
请问我怎么结合硬件配置?
多谢了

该用户从未签到

 楼主| 发表于 2008-9-8 14:36:50 | 显示全部楼层

还是出错

每个模式下边都出错误的。。。。。。
堆栈.jpg

该用户从未签到

发表于 2008-9-8 14:42:55 | 显示全部楼层
原帖由 kangsite 于 2008-9-8 14:18 发表
错误也不是一直有的。
偶尔不出现。
我设置了3个线程。
请问我怎么结合硬件配置?
多谢了


有一件事是:尽量不要在自己的线程中创建、删除或改动OSG对象,因为无法保证同步性。否则一旦和渲染线程产生冲突的话,几乎是必然要崩溃的。
osgtext换而使用addUpdateOperation来完成这些工作,至于为什么加入线程数超过1就会有几率出错,我猜想可能是由于两个UpdateTextOperation线程之间的冲突引起的,有可能是例子编写时的一些疏忽,您可以尝试给UpdateTextOperation线程的执行函数加一个Mutex之类的试一试。

[ 本帖最后由 array 于 2008-9-8 14:46 编辑 ]

该用户从未签到

 楼主| 发表于 2008-9-8 15:02:19 | 显示全部楼层

回复 5楼 的帖子

怎了在2.6版本下
osg::StateSet::addParent(osg:bject object)
{
if(getRefMutex())
{
>>>>>>>>>>>>>>>
(这一段起不了作用了,Mutex根本就用不上了,getRefMutex()函数一直是返回0)
}
else
{
>>>>>>>>>>>
}
}
同样removeParent()方法也同样存在这个问题。。

既然这样osg内部怎么实现互斥的?

该用户从未签到

发表于 2008-9-8 15:58:10 | 显示全部楼层
这是因为getRefMutex返回的值本来就是0

新的OpenThreads使用了原子计数(Atomic Counting)的功能,以求更高效地保证ref/unref的安全性,因此以往使用Mutex的地方被屏蔽掉了,为了测试和反馈新功能。
实现互斥用的就是Mutex,阻塞线程用的Barrier,可以参考《最长的一帧》中对于OpenThreads库的介绍

至于“osg内部怎么实现互斥的”,这个话题太大了。您可以查看源代码中使用了Mutex的地方,看看诸如DatabasePager等代码对于数据保护的实现
而osgtext的问题,如果您真的感兴趣并打算刨根问底的话,希望您向osg-users写信咨询,也许这是开发者在编写例子时的疏忽也说不定。

该用户从未签到

 楼主| 发表于 2008-9-8 17:37:13 | 显示全部楼层

回复 7楼 的帖子

多谢了。。
之所以这样问。。是项目中需要多线程添加文字。
同样出现这种错误

该用户从未签到

发表于 2008-9-11 23:26:34 | 显示全部楼层

我试过这样可以的

用一个string变量保存要显示的文字
tstring sText;
定义void setText(const tstring& text)
{
guard(mutex);//临界区保护
sText=text;
}

在PreFrameUpdate()中:
hudText->setText(sText);
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表