VS2005工具
VS2005工具(精选5篇)
VS2005工具 第1篇
SEL保护以其精确度高、配置灵活、功能全面而在继电保护应用领域占有一席之地,其中SEL-221F距离保护装置在早期的110 V以上的线路保护中应用较多。在SEL-221F距离保护装置的整定值设置中,距离保护的阻抗整定值要求输入的是被保护线路长度的百分数,而定值计算部门下达的定值清单中一般是被保护线路的整定阻抗值,需要现场调试人员进行转换计算,这对现场调试人员的知识面要求较高,给现场的保护校验工作带来诸多不便;另外,通过超级终端读取SEL-221F装置中的定值以进行定值校核时,又需要做相反的转换计算工作。为了解决现场计算转换的不便,设计一个简单实用、现场调试人员人人会用的工具就变得尤其必要。
1 计算转换工具项目的开发
1.1 工具界面的确定
本文以SEL-221F距离保护装置为模型,其所涉及的整定值及线路参数主要包括两类。第一类为需要进行计算转换的数据,包括如下6组:
1)线路一次侧单位长度或者全线路长度的电阻、电抗值;
2)线路一次侧单位长度或者全线路长度的电抗值、阻抗角;
3)线路二次侧(全线路长度)的电阻、电抗值;
4)线路二次侧(全线路长度)的阻抗值、阻抗角;
5)SEL-221F距离保护整定阻抗值(以欧姆为单位);
6)SEL-221F距离保护整定保护范围(以%为单位);
第二类是已知数据。如:CT变比、PT变比、被保护线路全长度、第一类前4组之一、第一类后2组之一,共有6个数据。
由于以上数据是用于现场验算转换之用,所以在VS2005中,工具界面选用对话框为主界面。
为了区分已知的、待计算的线路参数是单位长度还是线路全长,设置了一个check格式的核选框。因此,在对话框界面上有1个check核选框、12个edit编辑框、3个button命令按钮。见图1、图2所示。
1.2 界面元素的逻辑关系的设计和功能函数的编程开发
1.2.1 设置核选框变量及界面更新函数
设置check核选框的目的是简化界面、简化计算程序。为此,设置一个全局性变量,即表1中的(量纲属性变量)int m_iTotalRX(初始值为1)。其值含义:
1)如果m_iTotalRX=1,输入或求解的的电阻、电抗或阻抗值是线路单位长度的值,设置界面上IDC_STATIC1的变量m_sTextR文字为“单位长度电阻值”;
2)如果m_iTotalRX=2,输入或求解的电阻、电抗或阻抗值是线路全长的值,设置界面上IDC_STATIC1的变量m_sTextR文字为“线路全长电阻值”;
当单击核选框时,m_iTotalRX的值在“1”和“2”之间切换,单击核选框的响应函数为OnBnClickedCheck1()。在响应函数中,调用界面更新函数为UpdateDlgText(),并根据初始化时的必要参数进行线路单位长度和线路全长度阻抗值的转换计算。函数如下所示:
1.2.2 设置对话框界面编辑框使能的感知变量
为了防止输入错误和数据计算中的冲突,根据输入顺序,可以确定对话框中某些参数为计算参数,并使其所在编辑框不再接收手工录入数据。需设置的变量有两个:
a)显示模式变量int m_iDispMode(初始值为1):
已知输电线路的电阻、电抗分量值,设置m_iCalParaMode=1;
已知输电线路的阻抗值、阻抗角,设置m_iCalParaMode=2;
已知全长度线路二次侧电阻、电抗分量值,设置m_iCalParaMode=3;
已知全长度线路二次侧阻抗值、阻抗角,设置m_iCalParaMode=4;
b)计算模式变量(整定阻抗值到保护范围)int m_iResToRangeMode(初始值为0):
已知二次侧阻抗整定值,求线路长度百分比数,设置m_iResToRangeMode=1;
已知整定的线路长度百分比数,求二次侧阻抗整定值,设置m_iResToRangeMode=2;
1.2.3 确定界面元素逻辑关系并实现对输入参数的感知能力
确定界面编辑框中的逻辑关系如表1所示。
当改变表1中首选框ID为1的界面项(即编辑框edit1)时的响应函数OnEnChangeEdit1()主要内容如下:
当改变表1中首选ID为9的界面项(即编辑框edit9)时的响应函数OnEnChangeEdit9()如下:
至此,根据操作人员输入数据的顺序,即可确定需要计算的参数,并使对话框中的相应编辑框变为不可编辑。也可以说,本工具软件具有了一定的输入感知能力,效果如图1所示。
1.2.4 计算线路一二次相关参数及整定值参数
计算按钮的响应函数On Bn ClickedButton2()是本工具参数计算功能的最终实现,函数内容包括如下三个部分:
1)根据线路量纲属性变量m_iTotalRX的不同值,设置线路长度系数k1:
2)根据显示模式变量m_iDispMode的值及已输入的不同分组参数,使用switchcase语句,进行分步计算:
3)根据计算模式int m_iResToRangeMode变量的值,使用switchcase语句进行二次阻抗整定值与被保护线路长度百分比的转换计算并更新界面:
1.2.5 重置功能
为了进行多次不同模式的计算转换,本工具设置了重置功能,以设置相关参数的初始值,由button重置按钮完成。重置后的对话框效果如图2所示。
2 结论
通过应用VS2005软件开发平台,本文设计的基于SEL-221F距离保护定值参数核算工具,能根据使用者输入参数的逻辑顺序,自动感知需要计算的输电线路参数,有效地提高了现场保护调试人员的计算转换效率、准确率和精确度;同时,本工具可以满足其它人员对输电线路一、二次参数核算、保护范围确定等的不同需要,达到了预期的目的。
参考文献
[1]齐舒创作室.Visual C++6.0用户界面制作技术与应用实例[M].北京:中国水利水电出版社,1992.
VS2005工具 第2篇
关键词:Vs.Net2005报表,设计过程,使用过程
2010年下半年参与浦发银行单位绩效考核系统的开发, 用的是VS.Net2005, 我主要负责报表设计。项目刚开始时, 我习惯性使用水晶做了几张穿透式 (多级) 报表, 自我感觉还可以, 但与大家讨论时, 大家反映数据展示效果达不到预想要求, 又考虑到水晶报表格式调整比较繁琐、导出格式不友好并且在部署时还会遇到不少麻烦, 我决定尝试新的开发工具。“工欲善其事, 必先利其器”, 选择一个好的工具可以达到“事半功倍”的效果, 反之则“事倍功半”, 通过对比我最终放弃了水晶, 采用了本文要介绍的RDLC报表。
在VS.Net2005之前, 微软在SQL Server Reporting Services中已经提供了一种被称为报表定义语言 (Report Definition Language, RDL) 的语言;在VS.Net2005中, Microsoft提供了针对这种报表的设计器, 并提供了在WinForm和WebForm中使用这种报表的能力。Microsoft将这种报表的后缀定为RDLC, 那么C代表什么呢?C代表Client-side processing, 凸显了它的客户端处理能力。这里仅将在学习和使用RDLC过程中的一些感想和问题进行了梳理并与大家分享。由于学习这个工具的时间不太长, 如果表述出现偏差, 欢迎大家批评指正。
1 RDLC与水晶相比, 到底有哪些优势呢
优势:
1) 最大的优势当然是免费;
2) 布署方便, 只需在IIS服务器上把reportviewer.exe组件运行一下, 其他的设置没有任何变化;
3) 简化了报表设计, 控件简单易用, 支持拖曳;
4) 单个报表支持多数据区域, 多数据源;
5) 导出的Excel文件格式非常完美, 任何其它报表在这方面都不能与之比拟, 而且并不需要安装Excel;
6) 支持DrillThrough数据钻取功能;
7) 优秀的图表集成;
8) 由于rdlc本质上是一个xml文件, 所以对XML熟悉的同仁对rdlc的控制几乎可以达到随心所欲的地步。
缺陷:
1) 只支持.net平台,
2) 不支持客户端直接打印功能 (VS.Net2008中已解决此问题)
2 RDLC报表设计主要过程
为了便于介绍, 这里先介绍RDLC报表中的一个概念--数据区域 (Data Region) , 数据区域是用于显示基础数据集中重复数据行的数据绑定报表项, RDLC报表设计器中的数据区域包含控件面板上的一系列控件:List、Table、Matrix、Chart。单个报表可以包含多个数据区域, 每个数据区域只可以包含单个数据集中的数据。
1) 数据源
RDLC报表的数据源分为两种, 一种是通过SQL语句从数据库中得到的DataTable, 还有一种是业务对象。因为业务对象很少用, 本文不作介绍。DataTable最常见的使用形式就是“数据集”, 也就是xsd文件--一个强类型的DataSet, 其中包含了作为数据源的DataTable。DataTable的结构虽然固定, 但只要能理解它只是一个数据框架, 并没有限定数据只能来自固定的表或视图, 你就能灵活使用它了, 可以做到整个项目的所有报表只用一个”数据集”。
2) 报表设计
就是在设计界面拖拽报表控件设置布局。报表设计界面由三个主要区域组成:页眉、页脚和表体。表体中包含报表数据。您可以向报表布局中添加数据区域、文本框、图像、矩形、子报表和可视化增强功能。数据区域显示数据源中重复的数据行。页眉和页脚分别在报表每一页的顶部和底部重复相同的内容。可以在页眉和页脚中放置图像、文本框和线条等报表项。
3) 报表展示
就是将报表展示在应用程序的页面上, 这样用户可以对报表进行方便的查看和操作。RDLC报表在VS.Net2005中就是通过一个控件reportviewer来展现, 你要做的只是告诉它展现哪个报表, 使用哪个数据源 (不指明则使用在报表设计时使用的数据源) , 然后你精心设计的报表便完美的展现在你面前。
3 RDLC报表用到的主要控件
RDLC简化报表设计的主要原因是它将报表的构成要素极具成效的抽象为几个控件, 使报表设计不再繁琐, 开发人员能将更多精力集中在数据而不是报表格式上。
1) Matrix控件
Matrix控件是一个矩阵化的数据区域, 包含动态和静态的列和行, 可以使用行组和列组显示数据集包含的重复数据行。RDLC报表中的matrix控件功能相当强大, 它称得上是微软在报表设计上的一项重要创新, 它不仅是交叉表 (crosstab) , 还可以看作是一个带钻取功能的数据透视表 (pivot table) 。更重要的是, 作为被Microsoft封装过的一个控件, 只需简单的拖曳操作和属性设置就可以得到格式精美的报表。
2) Table控件
Table控件是一个表格化的数据区域, 具有固定的列数, 逐行显示数据, 可以向表添加分组。设计报表时将字段从Data Sources面板拖曳到Table控件的数据行中就可以了, 报表设计器会自动为你生成标题信息;至于footer中的统计信息, 可以使用快捷的表达式生成器;列宽可以通过拖曳来调整, 表格线可通过设置Table控件的属性来完成。一个表格控件可以具有零个、一个或多个分组, 还允许没有detailed rows。
3) List控件
List控件是一个容器化的数据区域, 可以在其中自由安排像TextBox、Table、Image等控件, 同样可以对数据分组。设计报表时将TextBox、Table、Image从工具箱拖曳到List控件, 按意愿安排其位置, 再将字段从Data Sources面板拖曳这些控件的数据域中。显示数据时List控件通过自我复制显示数据集的分组数据或明细数据 (如果没分组的话) 。使用List控件可以制作格式灵活的报表。
4) Chart控件
Chart控件是一个图形化的数据区域, 支持条形图、饼图和折线图等, 每种图表类型还有不同样式可选, 和Excel中的图表比较相似。设计报表时, 选择好要显示的图表类型后, 将相应的数据字段拖曳到类别字段、序列字段、数值字段即可。活用Chart控件会使报表的展现方式更丰富, 表现力更强。
4 RDLC报表设计实用技巧
为了让大家深入理解RDLC报表设计的高效和强劲的表现力, 我下面通过介绍一些实用技巧进行说明。
技巧1:让数据按次序进行颜色渐变
在项目开发过程中, 对统计好的数据比如销售业绩、工作进度等指标进行排名是一种比较常见的处理方法, 但单纯的排名给人的感觉不免单调, 利用RDLC报表中的Table控件通过简单的设置就可以实现数据的背景色按次序渐变, 大大增强排名的视觉效果。
实现过程:在设计视图选中Table控件的 (表详细信息) 行, 在其“BackgroudColor”属性中输入表达式:“=iif (rownumber (nothing) <=40, "#e2"&cstr (hex (46+10*rownumber (nothing) ) &"2e") , "#e2f62e") ”即可。如果你对颜色控制有心得, 你可以将表达式中的IIF函数换成switch函数甚至编码, 实现更为复杂的控制。
技巧2:对分组的数据进行排序
我们知道在服务器端进行分组和排序将会对数据库的性能构成相当大的挑战, 而现在最常用的桌面电脑的处理能力也称得上强劲。如果数据量不是极其巨大足以对公司局域网造成压力, 把数据拉到客户端进行处理 (相当于分布式计算啦) 应该是一种比较聪明的作法, RDLC的Table控件当然支持报表设计时常用的数据分组功能, 而且通过简便的设置便可对分组后的数据进行排序, 更可通过简单设置轻易控制明细数据是否显示实现类似于主从表的效果。请看如图1~图3的示例。
技巧3:简单设置实现透视表效果
本文开头提到的用水晶的穿透式报表展示数据效果达不到要求的情况, 大家想要的实际上是数据透视的效果, 这在水晶报表中是几乎不可能完成的任务, 但对于RDLC来讲, 使用它提供的Matrix控件, 只需简单的拖曳即可实现, 令人头疼的行列变换、数据的汇聚分拆完全交给控件自己控制, 正如前文所说“它称得上是微软在报表设计上的一项重要创新”。
技巧4:多种形式的“子”报表
在设计报表过程中, 经常会有通过关键指标或汇总后的数据查看明细或类似于对帐单的主从表等需求, 因为找不到合适的称谓, 这里我将此类报表的设计统称为“子报表”, 之所以加上引号, 是因为RDLC中还存在一个真正意义上的子报表Subreport控件。
1) 利用List控件分组, 嵌套Table控件显示明细, 特点是组成主从表的各组件居于同一报表视图, 并使用同一数据源。
2) 利用List控件分组, 嵌套subreport控件显示明细, 特点是用放置于主表内subreport控件显示子报表, 主表和子表各自独立设计并使用各自的数据源。有了子报表的支持, 为我们制作对帐单一类的单据式报表带来很大便利。
3) 大家熟知水晶可实现Drillthrough穿透式报表, 而RDLC的穿透式 (又称导航式报表) 报表个人感觉比水晶还要出色, 这种形式的报表并不是通常意义上的主从表, 但由于这种报表的用途主要集中在实现主从表上, 所以放在此处介绍。它的特点是主从表并无严格意义上的主从关系, 主表 (名义上) 和从表 (名义上) 各自独立设计并使用各自的数据源, 其主从关系主要体现在数据关系上。
技巧5:一张报表多个数据区域使用多个数据源
由于RDLC报表允许在一张报表中存在多个数据区域, 而每个数据区域都可有自己的数据源, 因此, 一张报表使用多个数据源就很容易理解了。下图这张报表中每个chart控件的数据分别来自数据库中不同的表。
技巧6:向RDLC报表传入参数
在技巧4的介绍中, 我们已经用到了使用参数的RDLC报表, 给人的感觉都是报表与报表之间传递数据用的, 实际上前面那些带参数的报表都是可以作为正常报表使用的, 我们可以在网页的代码中向报表传递参数, 并通过reportviewer控件进行展示, 这样就使报表具有多样化的表现方式, 比如你可以设计一个专门用于查询员工的页面, 下面是给前面图9中设计的作为子报表的报表传递参数的代码:
有一点务必注意, 由于RDLC报表支持多个参数, 为了接口上的统一, 即使你的报表只使用了一个参数, 你也必须如上所示将它赋予一个参数数组才能向报表传递, 否则会报错。
技巧7:动态加载报表
在设计报表过程中, 我曾遇见使用同一数据源, 但因选择条件不同而需要展示不同形式的报表的情况, 当时看到reportviewer控件有localreport.ReportPath这个属性, 以为可以通过控制这个属性的值达到目的, 但最终发现reportviewer控件只显示第一次加载的报表, 原因不明。之所以把这个问题放在这里, 是希望大家不要再去尝试这个办法。要解决这个问题, 得用以下办法, 就是在编程时动态创建新的reportviewer控件, 并对其设置localreport.ReportPath, 代码如下:
技巧8:控制reportviewer控件的高度和宽度
RDLC报表需要用放置于WEB页面的reportviewer控件进行展示, 默认情况下, reportviewer控件的尺寸就是你在设计WEB页面时指定的大小, 但分辨率不同的显示设备显示固定大小的reportviewer控件时效果差异较大, 笔者经过一番艰苦的探索, 最终发现可以用页面的尺寸来控制reportviewer控件的大小, 最终达到比较满意的显示效果。
页面前端代码:
其中iPoint为一隐藏控件, myTable为放置reportviewer控件的表格, x[1]是指reportviewer控件放在表格的第二行, 其高度为页面减90px, 这90px包括页面顶部放置的按钮或装饰性图案和表格第一行的高度, 另外减30px作为reportviewer控件的高度预留其下侧滚动条的空间。
5 结论
如果你开发的系统只是在windows平台上运行, RDLC报表的开发效率和强大的表现力及与Offiece工具的完美融合让我们完全有理由放弃Crystal Report。
参考文献
[1]蜡人张博客[EB/OL].http://www.cnblogs.com/waxdoll/category/49402.html.
VS2005工具 第3篇
关键词:交互式三维图形软件,OVI,OpenGL,VS2005
1 Open Inventor
1.1 Open Inventor是什么
Open Inventor(OVI)是基于OpenGL(Open Graphics Library)[1]的面向对象的开发三维图形软件开发包,其本身用C++编写。程序员使用OVI可以快速、简洁地开发出各种类型的交互式三维图形软件。
1.2 Open Inventor与OpenGL的区别
在文献[2]中,有一段文字形象地介绍了OIV与OpenGL之间的差别。假设要建造一栋房子,可以将使用砖头、水泥、沙子等来建造房屋的原始方式比作使用OpenGL来开发程序,而将利用预制水泥构件、成套室内设备来建造房屋比作使用OIV来开发程序。这种比喻形象地说出了OIV开发程序具有简单、高效的特点。而且OIV和OpenGL是相容的。在OIV中提供了多种方法允许直接调用OpenGL的命令,这使得OIV的功能变得更加强大。
1.3 Open Inventor的特点
1)OVI是面向对像的封装了OpenGL的开发包,因此其程序开发简单、高效;
2)OVI具有平台无关性,它可以在Unix、Windows、Linux等多种操作系统中使用;
3)OVI允许使用C、C++、Java、.Net多种编程语言进行程序开发,且提供了多种方法允许直接调用OpenGL命令;
4)OVI的应用领域非常非常广泛,涉及到机械工程设计与仿真、医学和科学图像、地理科学、石油钻探、虚拟现实、科学数据可视化等;
5)OVI基本上成为面向对象的3D图形开发“事实上”的工业标准。
1.4 Open Inventor的体系结构
如图1是OVI的体系结构,OVI建立在OpenGL和不同的操作系统的基础之上。OVI组件库向下屏蔽具体的操作系统细节,向上为用户提供统一的用户界面接口,比如针对Microsoft Windows系统,OVI组件库提供SoWinXXX等接口,针对Unix系统,提供SoX-tXXX等接口。
OVI 3D工具包包括3D场景数据库、一组节点工具包、一组操作。
3D场景数据库包含有形体、属性、组、引擎和传感器等节点对象,这些节点是用来创建3D场景数据库的“积木块”,每个节点存有一些信息,这些信息可能是3D物体、表面材质、形状描述、几何变换、灯光或照相机等信息。不同的节点的有序集合组合成场景保存在OVI的基础数据库中,这个数据库就是OVI的3D场景数据库。
节点工具包是一些按照某种规则组合在一起的节点集。它有助于创建协调一致的场景数据。
操作器是一种特殊类型的节点,可以响应用户产生的事件,比如用户可以在屏幕上通过鼠标直接操作它。通常,操作器带有外观形状,而且都提供了将事件转换进数据库中的方法。操作器为应用程序提供了一种与3D物体间直接进行交互作用的简便方法。
OVI还可以通过内建的3D交换文件格式,在应用程序之间进行数据交换。操作3D应用程序的用户可以通过剪切、粘贴场景中的3D对象,与桌面上的其它程序共享这些对象数据。
2 Open Inventor程序开发思想与步骤
2.1 Open Inventor程序的开发思想
OVI为程序员提供了类似MFC类库的框架,而不像OpenGL直接调用API的方式进行3D应用程序开发。OVI包括许多节点组件,程序员在不同类型的节点中设置3D物体、表面材质、形状描述、几何变换、灯光或照相机等信息,然后将这些节点作为“积木块”,在程序中有机地组织起来,就可高效地开发出可交互的3D程序。而大量的程序初始化、3D图像绘制、3D图形渲染、消息处理、与用户交互等复杂的工作对于程序员来说都是透明的,由OVI的底层机制自动完成。
2.2 Open Inventor程序的开发步骤
通常情况,在VS2005中开发OVI步骤主要包括四个步骤:
步骤一初始化窗口和视口:
一个3D图形要显示,必须依赖于窗口。通常程序员需要初始化一个系统窗口,并在该系统窗口中初始化视口,以便图像在该视口中显示。这里的视口可以使用渲染场景的窗口类SoWinRenderArea(渲染区),也可以使用观察器组件SoWinExaminerViewer。
步骤二建立场景:
场景是由许多不同的节点组成。首先需要建立场景的根节点,然后创建比如3D物体、表面材质、形状描述、几何变换等节点,接下来设置这些节点信息,然后加入场景,形成场景节点树。
步骤三遍历渲染场景:
在程序中,使用OVI的几条简单的语句,从场景的根节点开始,遍历所有节点,根据各节点的信息渲染3D图形,并显示在视口中。而遍历的方式以及渲染的细节,对于开发人员来说都是是透明的。
步骤四回收资源退出:
程序结束,需要将场景数据库资源和视口资源释放。
读者可根据该文的第四部分详细体会OVI开发的这4个主要步骤。
3 Open Inventor在VS2005中的环境搭建
目前工业界中比较成熟和典型的OVI包有三种:SGI的OVI,TGS的OVI,SIM的OVI。OVI最早由SGI提出并开发,其OIV主要用在UNIX操作系统下。TGS公司最早将OIV由Unix系统移植到Microsoft Windows下,它是目前世界上使用最多的OIV版本,但其属于商业软件包,版权费用昂贵,不适合普通用户学习和使用。SIM公司开发的Coin3D OIV可以同时在UNIX和Microsoft Windows下使用。虽然它的功能和性能没有TGS的OVI强大,但开发一般的3D应用程序绰绰有余。而且它是一个开源的OIV开发包,可以让初学者了解OIV内部运行的机理,更适合普通用户学习和使用。
接下来我们使用SIM公司的Coin3D OVI,详细研究、讨论在VS2005中搭建OVI的具体操作步骤。
步骤一安装VS2005:
Microsoft公司的VS2005安装是可视化、一键式的,非常方便轻松,这里不多作讨论。
步骤二下载并安装Coin3D:
Coin3D是SIM公司的OVI图形库,可以在地址[3]中下载。该地址有许多版本的Coin3D。如果下载的是可安装文件,就直接安装,然后检查系统环境变量COINDIR和PATH是否分别是:Coin3D安装目录、Coin3D安装目录bin。如果下载的不是安装文件,将其解压到某个目录下,而且还需手动设置系统环境变量COINDIR和PATH。这里因为VS2005中的VC版本是8.0,因此下载Coin-3.1.0-bin-msvc8.zip。它没有安装文件,将其解压到D盘(这里用户可以任意解压到一个目录)Coin-3.1.0-bin-msvc8目录,然后设置COINDIR和PATH两个系统环境变量。COINDIR是Coin-3.1.0-bin-msvc8的解压目录,而PATH是其解压目录下的bin目录。PATH的环境变量设置如图2所示。
步骤三下载并安装SoWin:
SoWin是基于Windows的窗口组件,任何使用Coin3D开发的OVI程序都需要依靠SoWin在Windows系统中显示和展现,而且它还为3D图形提供与用户的交互接口。这里下载SoWin-1.4.0.zip。解压该目录,然后将SoWin-1.4.0目录放在D:Coin-3.1.0-bin-msvc8中。
在SoWin-1.4.0文件夹中的build目录,选择适合的版本,打开工程文件进行编译(我们这里选择msvc8版本)。为了防止在编译的过程中出现cmd.exe错误,需要设置可执行文件使用路径。在VS2005的[工具][选项][项目解决方案][VC++目录]的“可执行文件”列表中添加这三项“$(SystemRoot)System32”、“$(SystemRoot)”、$(SystemRoot)System32wbem,如图3所示。接下来进行调试编译,如果编译中报类似“无法打开文件coin2d.lib”错误,需要在VS2005的[项目][sowin1属性][配置属性][链接器][输入][输入依赖项]中的coin2d.lib改为coin3d.lib,然后再编译调试。编译过程中没有报错,会在Coin3D的目录里自动生成SoWin的一些文件,比如sowin1d.dll和sowin1d.lib等,而且在Coin3D目录下的includeInventor里面增加一个Win头文件目录,这说明SoWin编译安装成功。
步骤四OVI应用程序的VS2005环境设置
在开发、编译OVI应用程序前,需要在VS2005中做一些配置才能使OVI程序正常运行。
1)建立OVI项目前,增加Coin3D的Lib目录路径。
在VS2005的[工具][选项][项目解决方案][VC++目录]的“包含文件”列表中增加Coin3D的Include目录路径,在VS2005的[工具][选项][项目解决方案][VC++目录]属性页的“库文件”列表中增加Coin3D的Lib目录路径,如图4所示。
2)编译OVI项目前,为该项目配置预处理器。VS2005[][
在VS2005的[项目][项目名属性(这里项目名是新建项目的名称)][配置属性][C/C++][预处理器]的“预处理器定义”栏增加“COIN_DLL和SOWIN_DLL”,如图5所示。
3)编译OVI项目前,为该项目配置链接器。
在VS2005的[项目][项目名属性(这里项目名是新建项目的名称)][配置属性][链接器][输入]的“附加依赖项”栏增加“coin3d.lib”和“sowin1d.lib”,如图6所示。
以上操作步骤完成以后,Coin3D OVI在VS2005中的环境设置就算完成,然后就可以进行OVI程序的开发和调试。
4 一个简单的Open Inventor程序
下面是一个简单的OVI程序代码,可在文献[2]中第二章找到,该文作了简要修改。它是一个红色的圆锥。程序代码如下:#include
程序运行后如图7所示(它是运行后进行旋转操作后的图片)。
该程序使用了一个OVI的Win窗口,它是OVI组件库的一部分。组件库带有窗口管理和事件处理功能,还包括一系列OVI组件。我们可以在窗口中对圆锥进行旋转、缩放等操作。程序一共只有十几行代码,却开发出如此功能丰富的交互式三维图形程序,这充分说明利用OVI开发交互式三维图形程序的简单、快捷。
5 结束语
Open Inventor(OVI)是基于OpenGL的面向对象的开发交互式三维图形软件开发包,可以用它快速、简洁地开发出各种类型的交互式三维图形软件。该文详细地研究、讨论了OVI的开发步骤以及VS2005中如何搭建OVI开发环境步骤,希望能够给OVI的初学者提供入门帮助。
参考文献
[1]OpenGL[EB/OL].http://baike.baidu.com/view/9222.htm.
[2]The OpenInventor Mentor:Programming Object Oriented 3D Graphics with Open InventorTM,Release2.Josie Wernecke and Open InventorArchitecture Group[M].Addison Wesley,1994.
VS2005工具 第4篇
本文介绍了一种在多层窗口的MFC应用程序中,子窗口调用父窗口的类中的成员函数及控件的方法。在工程实践中,就MFC应用程序而言,多窗口程序的优点显而易见。程序方便,简洁,有层次感,人机界面友好,占用资源很少, 操作灵活等等,不一而足。
二.实例分析
对大中型程序来说,由于功能上的需要,很多情况下需要在子窗口中调用父窗口的成员函数及控件。本文中所用到的实例是在Visual C++2005编程环境下输入、编译和运行的一个简单的MFC程序。该程序主要实现的是两个目的,第一,通过RS232串口通信控制两个小型步进电机执行预定的动作,第二,通过RS232串口通信监视一个马尔测量仪的数据输出。
本程序包含多个窗口,其中,父窗口为uEyeActiveXDem,其中一个子窗口为IDD_MOTOR。在父窗口uEyeActiveXDem中包含了一个通用串口类CSerialPort,现在需要在子窗口IDD_MOTOR中调用父窗口uEyeActiveXDem中包含的通用串口类CSerialPort中的方法及控件。
父窗口uEyeActiveXDem的代码片断:
在父窗口u EyeActiveXDem的头文件uEyeActiveXDemoDlg.h中MotorPort1, MotorPort2, MahrPort被声明为公共的静态的组员,是通用串口类CSerialPor的实例。代码片断如下:
现在,如果要在子窗口IDD_MOTOR中调用父窗口uEyeActiveXDem中包含的这个通用串口类CSerialPort的成员函数及控件,只需简单的在子窗口IDD_MOTOR加以声明引用即可。
在子窗口IDD_MOTOR的头文件MotorSetDlg.h中需要对通用串口类CSerialPort加以引用,代码片断如下:
同样, 在子窗口IDD_MOTOR的程序体中MotorSetDlg.cpp中需要对通用串口类CSerialPort加以引用,代码片断如下:
这样就可以在子窗口IDD_MOTOR的程序体中的任何位置调用父窗口u EyeActiveXDem中包含的通用串口类CSerialPort的任何成员函数及控件。其调用方法如下:
(Motor2Cmd[1]) ;//串口类CSerialPort的成员函数WriteToPort在子窗口IDD_MOTOR的函数中被调用。
三.总结
本文所用到的方法,其实就是对父窗口所包含的类进行实例化,然后再在子窗口里进行引用执行。如果是动态的话,也就是说窗口之间相互操作的话,可能会有一些困难。微软本身也并不推荐这样做。
摘要:在工程实践中, 就MFC应用程序而言, 多层窗口程序的优点显而易见, 程序方便, 简洁, 有层次感, 人机界面友好, 占用资源很少, 操作灵活等等, 不一而足。本文介绍了一种在多层窗口的MFC应用程序中, 子窗口调用父窗口的类中的成员函数及控件的方法。
关键词:VS2005,MFC,成员函数,窗口
参考文献
[1]李勇, 一个多串口多线程数据采集系统软件的设计与实现[M], 计算机集成制造系统-CIMS, 1999, (06)
[2]康灿, 王万玉, 基于串口的信号源与解调器微机控制系统[M], 微计算机信息, 2005, 10, 4-6
VS2005工具 第5篇
程序性能分析是在程序执行过程中,对其执行信息的搜集和分析的过程,它是衡量一个程序好坏的重要指标[1],通过程序性能测试可以客观地评价程序当前性能,判断程序是否满足预期的性能需求;其次,可以帮助寻找程序可能存在的性能问题,定位程序瓶颈并解决问题。
程序的性能包括很多方面,常见的有程序的运行时间,运行时占用的内存等[2],相对于内存优化,时间优化显得更为重要,所以在此主要讨论程序的时间优化问题。
性能优化的第一步是测量,测试性能数据是进行性能优化的基础,有了真实的数据,才可以分析数据。毫无疑问,优化应该是针对系统的性能瓶颈进行,而找到性能瓶颈应该是建立在准确的性能数据的基础上。分析工具能迅速帮助程序员定位程序瓶颈,在人们对软件要求越来越高的时代,性能分析工具已经成了不可或缺的一部分。
大多数的编译器以及操作系统有各自的分析工具。例如,Linux平台下的程序性能调优工具Perf、Gprof、GooglePerftools等;Windows平台下的性能分析工具very sleepy、Intel的VTune(同样兼容Linux)、Luke Stackwalker[2]等。文中则主要介绍VS2010自带的性能分析工具。
2 Profiler工具
Profiler即性能分析器,是Visual Studio 2010提供的一个程序性能分析工具。利用性能分析工具可以帮助我们在浩瀚如烟的代码中迅速锁定程序性能瓶颈,提高程序性能。
Visual Studio 2010中有一个新的菜单项“分析”,通过该菜单项可以找到子菜单“启动性能向导”。选择“分析|启动性能分析”将打开一个包含了3个步骤的向导,它将引导完成整个程序的性能测试[3]。
第一步,指定分析方法。
第二步,选定要分析的应用程序。
第三步,完成设置,启动性能分析,分析结束后会给出一份性能分析报告。
其中,性能分析报告中主要的关键字信息如图1所示。
3 与传统的程序瓶颈测试方法相比较
常见的排序算法有很多,下面则将50000(1-50000逆序数)个数顺序排列,并分别使用传统分析方法与性能分析工具来验证冒泡算法与堆排序算法的优劣。
3.1 两种算法介绍
3.1.1 冒泡排序算法
采用冒泡排序算法的函数代码如下:
冒泡排序算法的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。第二趟排序,将次小值2冒泡到第二位置。依次类推,直到没有反序的记录,由此推断,为n个数据排序时,总的时间复杂度为O(n2)。
3.1.2 堆排序算法
采用堆排序算法的函数代码如下:
堆排序算法的基本思想是,将待排序的序列构造成一个大顶堆,此时整个序列的最大值就是堆顶的根结点,将它移走,然后将剩余的n-1个序列重新构造成一个堆,即可得到n个元素中的次大值,反复执行,得到一个有序序列。
分析堆排序算法可以得出,它的运行时间主要消耗在初始构建堆和重建堆的反复筛选上。由二叉树的性质分析可得,第i次区堆顶并重建堆需要用O(log i)d的时间,且需要去n-1次堆顶,则重建堆的时间复杂度为O(n log n),所以堆排序的时间复杂度为O(n log n)。
从基本的时间复杂度分析可以看出,堆排序算法从时间角度上优于冒泡排序算法。如果验证,可以对这两种算法进行性能分析。对程序进行性能分析的方式大致可以分为两种,传统分析方法和使用性能分析工具。
3.2 传统性能分析方法
若要测试50000个数顺序排序消耗的时间,则需要在排序算法前后加入测试代码如下:
将50000个数顺序排列排序,采用冒泡排序算法消耗的时间为22653ms,若采用堆排序算法,耗时为36ms.
从时间角度上堆排序算法确实优于冒泡算法(冒泡算法的时间复杂度为O(n2),堆排序算法的时间复杂度为O(nlogn))。
这么看来,传统的性能分析方式好像很方便,但是冒泡算法耗时长,且堆排算法优于冒泡,节省了大部分的测试流程与时间。在一个庞大的且运行缓慢的程序中,像这样一点点的测试找到最为耗时的代码,工作量就太大了。
3.3 使用性能分析工具VS2010 Profiler
Profiler提出4种分析方法,这里只选择其中的两种方式分析:
3.3.1 采样模式
采样模式的工作原理如下:profiler通过定期中断(默认时1千万个CPU周期、页错误、高速缓存缺失等情况下执行采样)进程收集函数的调用堆栈信息[6]以及该函数的代码路径(非入侵式统计型分析方法)。采样模式速度快,开销低,仅在程序有效使用CPU时收集信息(当进程在等待磁盘、网络或任意其他资源时,Profiler并不会收集样本),且采样的结果会受操作系统中其他进程的影响,所以采样统计结果并不十分精确,适合于对程序全局性能进行初步的分析,找出程序瓶颈大致的区间。
根据Profiler的性能分析向导提示完成整个分析过程,使用冒泡排序算法的性能分析报告情况如下:
CPU使用率表示被分析的应用程序在进行分析的这段时间内占用CPU资源的情况,若运行某个程序后CPU使用率迅速变高,说明该程序有待优化,CPU使用率只是给人们提供一个CPU资源使用的曲线情况,并不能准确地定位程序的“瓶颈”,且CPU使用率的高低与CPU本身的强弱有直接联系。
SortData函数占用的采样样本数最多,所以SortData函数可能存在性能瓶颈。采用堆排序算法后的CPU使用率情况更优。因为采用冒泡算法的应用程序耗时长,而采用堆排序算法的程序耗时短.
优化后的SortData函数所占用的时间相对于优化前的函数增量为-59.52%(冒泡算法时间复杂度为O(n2),堆排序算法时间复杂度为O(nlogn)),说明采用堆排序算法的SortData函数从耗时角度来说确实得到了优化。
由此可见,借助于VS2010 Profiler,无论是使用采样模式还是检测模式,都可以快速地锁定当前程序的性能瓶颈,为程序的优化做准备。程序优化之后,Profiler仍然是一个必要的验证工具,通过比较优化前后程序分析报告可以直接看到程序是否真的得到了优化。相对于人工测试来说节省了很多不必要的时间,而且更为直观高效。这里仅仅只是小试牛刀而已,在庞大的程序中性能分析工具的作用远不止于此。
参考文献
[1]冯宏华,徐莹.C++应用程序性能优化[M].2版.电子工业出版社,2010.
VS2005工具
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。