我要发帖 回复

正式会员

3

主题

44

积分

0

专家分

:

私信
发表时间 : 2008-5-27 19:00:23 | 浏览 : 1929    评论 : 14
已有的例子是MFC的单文档程序,我想把它改成多文档,可是VEGA的系统调用一旦被始始化后不能再被线程调用初始化,所以我还是只能打开一个文档,打开第二个就报错,请问这该怎么解决,先谢了

最近VR访客

99daodan 评论于2008-5-29 19:11:21
是一个思路,等待中。
说不定用多通道能代替实现。
swandream 评论于2008-6-6 13:03:57
楼上说的有道理,好象例子中有个利用多通道实现了画中画
swandream 评论于2008-6-13 14:05:01
有人做过了吗?就是用MFC的界面,可以同时打开多个ADF文件
wgluser 评论于2008-6-19 08:26:48
看看华科的书吧,正在学习中
nuaadj 评论于2008-6-21 16:27:32
貌似没有办法解决,调试过一阵子的,印象中VEGA第二次始始化时好像在窗口初始化时出错,别的都可以重新初始化,好像很久以前南邮有篇文章说过这个的,可以找找
lizimeng116 评论于2008-6-24 10:06:42

回复 6# 的帖子

zhege
lizimeng116 评论于2008-6-24 10:07:13
wahaha
daxiong 评论于2008-8-12 19:36:02
我没有做多文档  ,只是在程序中加了一个线程 就出现了问题
topxiao 评论于2008-8-12 23:59:09
进程的问题
mqiezi 评论于2009-4-14 13:54:57
Vega应用程序可以通过应用定义文件(.ADF)来载入三维场景模型。在实际开发的应用中,当用户打开应用程序时,在不退出该应用的前提下进行三维场景切换是十分必要的。从Vega的应用程序框架中我们可以看出,框架主要由它的配置三步曲和渲染主循环构成。当用户已经打开一个场景后需要切换到另一个场景时,程序正处于渲染主循环中,本应只需用配置三步曲中的第二步导入另一个.ADF文件再进行第三步设置或三步曲皆重新作过再进入渲染主循环即可,遗憾的是由于某些未知的具体原因(并非程序结构的实现技术问题)而行不通。

    由于Vega系统提供的是链接库形式的函数调用,没有源码,从设计软件系统的角度来看,这种为了保证整个系统的完整性,系统外部接口的一致性,系统内部更新的独立性以及系统内部实现技术的保密性等而进行的封装是完全有必要的。然而在保证以上特性的前提下,给开发用户提供必要的诊错手段也是必不可少的。在这方面Windows的API调用以及MFC类库等做的十分好,它们在许多操作的结果通常都返回一个值,以告诉用户是否成功或是失败还是出现异常,更完善的是Windows系统提供了一个全局的函数调用GetLastError(  )操作来获取每一步操作后的结果是否成功。
   
    从设计模式的观点来看,这是使用了单件模式(Singleton),它使得在程序的任何位置都能直接访问到该函数。而在Vega系统里却没有提供如此完善的诊错手段,它的大部分操作没有返回结果,因此用户只能认为此次操作成功了。然而一旦程序出现了问题,用户将会不知所措。而且,由于Vega将类的接口定义都“封装”起来了,用户所能获取的仅仅是一个可用来充当句柄的类的指针而已,一些与面向对象有关的继承、多态、消息操作[4]等皆无明显体现,这大概与Vega旨在最大限度的兼容现有程序的移植目标有关吧。

    若在Vega线程未退出时进行重新配置将导致失败,那么在切换场景时让正在运行的线程自然终止而重新开启另一个线程应该不会有错了。

    然而结果是令人沮丧的,出现一个地址访问保护的错误。导致这种错误的主要原因是引用的无效的指针,该指针所指的空间要么是分配空间后已被释放,要么是指向其它线程的局部地址空间。为什么会出现这种错误呢?在第二次初始化Vega系统时,前一个Vega线程不是已经终止了吗?所以一定存在遗留问题。

    经调试跟踪显示,问题就出在Vega配置三步曲的第一步vgInitWinSys()上,该函数的作用主要是初始化Vega系统并创建共享内存以及信号量等,除此之外它还在后台做了一件重要的事情——就是又开启了一个Vega窗口子线程,该子线程根据传送的窗口句柄参数创建一个与该句柄对应窗口一相同大小的窗口二,并将它蒙(覆盖)在窗口一上,这是Vega开发指南上未有提及的,这样Vega系统的渲染窗口就可以嵌入到基于MFC的视口上了。

    该子线程的创建是必不可少的,但却没有终止它的办法——它是Vega函数内部创建的。又因为线程隶属于进程,只有进程结束了,所有的线程才全部退出。所以即使创建它的父线程已死,它却还“活”着,不过因此而保留了一些无用的参数如无效的指针等。而更糟的是当第二个线程启动时,函数vgInitWinSys()却不再启动新的子线程而是继续保留原来没死的窗口线程,因此错误的发生是注定的。
其他网友的观点:

    1、"Vega系统里却没有提供如此完善的诊错手段,它的大部分操作没有返回结果",应该是处于运行效率的考虑。
    2、“该子线程根据传送的窗口句柄参数创建一个与该句柄对应窗口一相同大小的窗口二,并将它蒙(覆盖)在窗口一上,这是Vega开发指南上未有提及的,这样Vega系统的渲染窗口就可以嵌入到基于MFC的视口上了”。我曾经这样做过,用其它语言开发试图开发vega失败后采用的方法,但vega好象没必要这样设计吧?
    对于再入问题或者说场景切换,可以用子进程或者多场景配置的方式实现,不是大问题。
淡泊以明志 宁静而致远
mqiezi 评论于2009-4-20 11:53:18
我想遍历线程把vega开的给kill掉
淡泊以明志 宁静而致远
mqiezi 评论于2009-4-20 11:53:47
原帖由 daxiong 于 2008-8-12 07:36 PM 发表
我没有做多文档  ,只是在程序中加了一个线程 就出现了问题


线程同步的问题!
淡泊以明志 宁静而致远
ggw0122 评论于2011-4-10 19:03:04
谢谢分享
ggw0122 评论于2011-4-10 19:03:41
谢谢分享

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-6-19 06:21 PM

返回顶部