Vega Prime结合MFC

Vega Prime一般与VS2003结合使用效果最佳,当然也可以与VC6.0 结合。具体Vega Prime如何嵌入到MFC中,有两种方法:

1、在VC++6.0中新建一单文档程序在OnCreate()函数中加入初始化、定义、配置函数,如下:

result = vp::initialize(__argc, __argv);
// 设置ACF文件
CString acfFile;
if (__argc <= 1)
acfFile = "mfc.acf";
else
acfFile = __argv[1];
// 加载ACF文件
result = vpKernel::instance()->define(acfFile);
// 配置
result = vpKernel::instance()->configure();
//得到Vega Prime中的第一个窗口
vpWindow *vpWin = *vpWindow::begin();
// 将view设为Vega Prime窗口的父窗口
vpWin->setParent(m_hWnd);
//设置定时器
SetTimer(TIMER_ID, 100, NULL);


OnCreate()函数是在系统帮我们创建好窗口后,但还没显示时调用的。这样当窗口显示在我们面前时。Vega Prime的初始化、加载ACF文件的任务也全完成了。在最后设置了一个100ms的定时器,这定时器主要是用来实现帧循环的,此处的100ms决定了仿真时的帧速率。为了得到更好的仿真效果,可以将定时器设置的更小一些,此外,帧速率还要由其它的因素决定。

定时器的消息响应函数如下
void CMFCView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
int frameNum = vpKernel::instance()->beginFrame();
assert(frameNum != 0);
…//此处增加你的仿真函数
int result = vpKernel::instance()->endFrame();
assert(result == vsgu::SUCCESS);
CView::OnTimer(nIDEvent);
}
2、线程方法启动Vega Prime
在OnCreate()函数中加入开线程函数,然后在线程函数中进行Vega Prime初始化、加载ACF文件、主循环等,具体实现如下
m_pVegaThread=AfxBeginThread(vpWorkThread,(LPVOID)this); //开线程
UINT vpWorkThread( LPVOID pParam )
{
CView* pView = (CView*)pParam; //得到view的指针
vp::initialize(__argc, __argv); //初始化
pView->define(); //加载ACF文件
pView->configure(); //配置
pView->run(); //主循环
pView->unconfigure();
vp::shutdown(); //退出
return 1;
}
在Windows中线程分为UI线程和工作者线程,MFC中的UI线程是专门用来响应用户事件的,最好不要把繁重的活交给他做。相对于UI线程,其它的线程叫工作者线程。工作者线程是专门处理繁重事务。所以说你最好把Vega Prime主线程放在MFC的工作者线程里执行,这样UI响应用户事件就很快了,同时要做好主线程和工作线程之间的协调工作。在最后退出应用程序之前一定要先结束工作线程。在工作线程中Vega Prime还会自动开启其它的一些线程来处理画面的更迭和模型的渲染,若直接退出主线程,则会引起异常。




参考文献:徐鹤,基于Multigen Creator/Vega Prime无人机三维视景仿真系统的
设计与实现

你可能感兴趣的:(图像处理/计算机视觉)