编程平台(精选九篇)
编程平台 篇1
智能手机功能越来越强大,Android平台手机占智能手机的主要部分,在许多功能方面甚至已经超过平板和电脑,表现最为突出的就是智能手机支持越来越多的传感器,利用这些传感器,结合GPS等装置,可以创造出适用于自动控制、空间模拟、动漫游戏等领域各种各样丰富多彩的应用。手机配置的传感器如下表所示。
2 Android 平台传感器编程简介
Android手机传感器编程,首先要了解手机上传感器情况。
随着Android开发平台的功能扩展,传感器数据逐渐规整,调用接口更加规范,编程使用更加简便。
3 Android 平台传感器综合编程
传感器数据统一存放在event.values中,以方向传感器编程为例,在方向传感器中event.values数组变量的3个值分别表示三个方向的度数,含义如下表所示。
创建传感器管理器和传感器监听器,管理器管理传感器并创建传感器,监听器监视传感器状态和数值变化。
方向传感器要求手机具有电子罗盘,其他传感器编程大同小异,方法和步骤基本相同。
4 总结
编程平台 篇2
本文以及以后的系列文章将专门针对.NET讨论各种编程问题。我将假设你已经熟悉面向对象的编程概念。每一篇文章的内容都聚焦在非选定的特定公共语言运行时编程主题上。所有.NET开发人员必须知道这些主题。
当展示代码例子时,我必须在支持.NET CLR 的多种语言中选择一种。我决定使用C#。它是微软设计的一种新语言。
真正的面向对象设计
对于使用Win32 SDK的编程人员来说,对大多数操作系统特性的访问时通过一组从动态链接库输出的独立函数实现的。这些独立的函数从诸如C这样的非面向对象语言中非常容易调用。但对于一个新的开发人员来说,要面对上千个表面上看来毫无关系的独立的函数是相当让人畏惧的。更为困难的是许多函数名是以单词“Get”开始的(如GetCurrentProcess和GetStockObject)。此外,Win32 API已经历数年并且微软添加了新的函数,这些新函数依旧的函数相比。有相似的语义,但提供的特性有些差异。你常常能认出较新的函数,因为它们的名字原来的函数名相似(象CreateWindow/CreateWindowEx,CreateTypeLib/CreateTypeLib2以及我最喜欢的CreatePen/CreatePenIndirect/ExtCreatePen
所有这些问题都使程序员觉得Windows开发很难。随着.NET平台的出现,温柔终于为叫苦不迭的开发人员提供了一个完全面向对象的开发平台。平台服务现在被分成为单独的名字空间(如:System.Collections,System.Data,System.IO,SystemSecurity,System.Web等等)并且每一个名字空间包含一组允许访问平台服务的相关类。
因为类方法可以重载,行为差别不大的方法具有相同的名字,并且只有从原型中才能看出差别来。例如,一个类可能提供三个不同版本的CreatePen方法。所有方法都做相同的事情:即创建一支笔。但是,每一个方法都有不同的参数集并且行为不太一样。将来微软还要创建第四个CreatePen方法并且与前面的类方法配合默契。
因为所有的平台服务都通过这种面向对象的方式来实现,所以软件开发者应该对面向对象的编程有所理解。面向对象的方法还带来了其它的一些特点,如使用继承和多态性很容易创建专门版本的基类库类型。我再次强烈建议要熟练掌握这些概念,这对于使用微软的.NET框架很重要。
System.Object
在.NET中,每一个对象都是从System.Object派生而来。也就是说下面的两种类型定义(使用C#)是相同的:
class Jeff {
...
}
和
class Jeff : System.Object {
...
}
因为所有对象都是从System.Object派生出来的,从而可以保证每一个对象具有最小的功能集。表一是System.Object中的公共方法。
公共语言运行时需要所有的对象都要用new操作符创建(调用newobj IL指令)。下列代码示范了如何创建Jeff类型(已在前面声明)的对象实例:
Jeff j = new Jeff(“ConstructorParam1”);
new操作符根据指定的类型需要从堆中分配字节数来创建对象。它初始化对象的开销成员。每一个对象都会有一些公共语言运行时用来管理对象的附加字节,如对象的许表指针以及对同步快的引用。
调用类的构造函数时,传递的参数在new语句中指定(例子中是串“ConstructorParam1”)。注意大多数语言会编译构造函数以便它们调用基类构造函数,但这在公共语言运行时中是不需要的。
在new实现了所有我所提到的操作后,它返回新创建对象的引用。在例子代码中,这个引用被存储在变量j中,它的类型是Jeff。
另外,new操作符没有配对操作(delete)。即没有方法显式地释放或销毁对象。公共语言运行时提供自动地探测的垃圾回收环境,当对象不再被使用或不再被访问时自动地释放和销毁对象,有关这个主题将在下次的讨论中提出。
数据类型的强制转换
在编程过程当中,对象从一个数据类型到另一个数据类型的强制类型转换是十分常见的。在这一部分,我将讨论对象的强制数据类型转换规则。为此,先看下列代码:
System.Object o = new Jeff(“ConstructorParam1”);
先前的代码编译通过并正确执行是因为有一个隐含的强制类型转换。new操作符返回Jeff的一个引用类型,但o是一个System.Object的引用类型。因为所有的类型(包括Jeff类型)都能被强制转换为System.Object,隐含的强制类型转换是成功的。但是,如果执行下面的代码,就会有编译器错误,因为编译器不提供基类型到派生类型的强制类型转换。
Jeff j = o;
为了能通过编译,必须插入如下的显式强制类型转换:
Jeff j = (Jeff) o;
现在就可以编译通过并成功执行。
再来看另外一个例子:
System.Object o = new System.Object;
Jeff j = (Jeff) o;
第一行创建了一个System.Object类型对象。第二行代码试图将System.Object引用类型转换为Jeff引用类型。两行代码都能编译通过。但是在执行的时候,第二行代码产生一个InvalidCastException异常,如果捕获不到这个异常,将强制应用程序终止。
当第二行代码执行时,公共语言运行时查证o所指的对象就是Jeff类型对象(或任何Jeff派生类型)。如果是,则公共语言运行时允许强制类型转换。否则,如果o所指的对象与Jeff类型无关,或是一个Jeff的基类,则公共语言运行时会预防这种不安全的强制类型转换并产生InvalidCastException异常。
C# 使用as操作符提供另一种方法来实现强制类型转换:
Jeff j = new Jeff(); // 创建一个新的Jeff 对象
System.Object o = j as System.Object; // 强制转换 j 为一个System.Object对象
// 现在o 指Jeff 对象
as操作符试图强制转换一个对象为指定的类型。但与通常的强制转换不一样,如果对象的类型强制转换不成功,结果会是null,as操作符决不会掷出异常。当引用有毛病的强制类型转换发生时,将产生NullReferenceException异常。下列代码示范了这种情况。
System.Object o = new System.Object(); //创建一个新的Object 对象
Jeff j = o as Jeff; //强制转换 o 为一个Jeff对象
// 上面的强制转换失败:不会有异常掷出,而j会被置为null
j.ToString(); // 访问j时产生一个NullReferenceException 异常
除了as操作符以外,C#还提供一个is操作符。它检查是否一个对象实例与给定的类型兼容并判断结果是True或是False,
Is操作符不会产生异常。
System.Object o = new System.Object();
System.Boolean b1 = (o is System.Object); // b1 是 True
System.Boolean b2 = (o is Jeff); // b2 是 False
注意,如果对象引用是null,is操作符总是返回False,因为得不到对象来检查其类型。
为了肯定你理解了刚才所说的内容,假设下列两各类定义存在。
class B {
int x;
}
class D : B {
int x;
}
现在,参见图二看看哪一行代码通过编译并执行成功(ES),哪一行代码导致编译器错误(CE),哪一行代码导致公共语言运行时错误(RE)。
集合与名字空间
类型集可以被分组成集合(一个或多个文件集)并且被展开。在一个集合中可以只存在单独的名字空间。对应用程序开发人员来说,名字空间就像有关联的类型的逻辑分组。例如,基本类库集合包含许多名字空间。System名字空间包括Object基类型、Byte、Int32、Exception、Math和Delegate之类的核心低级类型,而System.Collections名字空间包括的类型如AarryList、BitAarry、Queue和Stack。
对于编译器来说,名字空间只不过是名字较长的的类型名,以及其唯一性是用句点分隔某些符号名来保证的。对于编译器而言,System名字空间中的Object类型只不过是用一个叫做System.Object的类型来表示。同样,System.Collections名字空间中的Queue类型简单地用标示符System.Collections.Queue来表示。
运行时引擎不知道关于名字空间的任何信息。当你访问一个类型时,公共语言运行时只需要知道完整的类型名字以及哪一个集合包含这个类型的定义,以便公共语言运行时能正确加载集合,从而找到要访问的类型并处理之。
编程人员通常都想用最简练的方法来表达算法,但用完全限定名引用每一个类类型的话极其麻烦。因此,许多编程语言提供一条语句来指示编译器添加各种前缀到类型名,直到实现一个匹配。当用C#编程时,我经常在源代码的最前面是用下面的语句:
using System;
当我在代码中引用一个类型时,编译器需要保证这个类型被定义过并且我的代码要以正确的方式访问这个类型。如果编译器不能找到指定的类型,它试图将“System.”添加到类型名并检查产生的类型名字是否与现存的类型名匹配。前面的代码行允许我在代码中使用Object,并且编译器将自动将名字展开为System.Object。我肯定你能轻松想象这样省去了多少键盘输入。
当进行类型定义的检查时,编译器必须知道哪一个集合包含了这个类型,以便这个集合的信息和类型信息能被送到结果文件中。为了获得集合信息,你必须将定义了任何引用类型的集合传给编译器。
正如你所设想的一样,这种设计存在一些潜在的问题。为了编程方便,你应该避免创建名字冲突的类型。但是在某些情况中,它完全不可能。.NET鼓励组件重用。你的应用程序可以利用Microsoft所创建的组件,同时,你也可以用Richter创建的另一个组件。这些公司的组件可能都提供了一个叫做FooBar的类型,-Microsoft的FooBar所做的事情与Richter的FooBar所做的事情完全不同。在这种情况下,你无法控制类类型的命名。为了引用Microsoft的FooBar,你使用Microsoft.FooBar,为了引用Richter的FooBar,你使用Richter.FooBar。
在下列的代码中,对FooBar的引用是不明确的。编译器报告一个错误也就罢了,但是实际上C#编译器挑选FooBar类型的一种可能的情况;直到运行时你才能发现问题:
using Microsoft;
using Richter;
class MyApp {
method void Hi() {
FooBar f = new FooBar(); // Ambiguous, compiler picks
}
}
为了排除这种不明确的引用,你必须显式地告诉编译器,你想创建哪一个FooBar。
using Microsoft;
using Richter;
class MyApp {
method void Hi() {
Richter.FooBar f = new Richter.FooBar(); // 明确引用
}
}
另一种语句形式是允许你为单独类型创建别名,如果你只使用名字空间中的几种类型并且不想用所有的名字空间类型污染整个名字空间的话,这种方法很方便。下列代码示范了另一种解决类型不明确问题的方法。
// 定义RichterFooBar 为Richter.FooBar的别名
using RichterFooBar = Richter.FooBar;
class MyApp {
method void Hi() {
RichterFooBar f = new RichterFooBar(); // 不会出错
}
}
这种方法对于消除类型歧义有用,但不尽人意的地方仍然存在。假设澳大利亚的飞镖(Boomerang)公司(简称ABC)和阿拉斯加的船舶(Boat)公司(也简称ABC)两家公司各自创建了一个类型。可能两家公司都创建了叫做ABC的名字空间,在名字空间中包含一个叫做BuyProduct的类型。任何试图开发需购买飞镖和船舶应用程序的人将会陷入麻烦,除非编程语言提供编程方法来区分两家公司的集合-而不仅仅是两家公司的名字空间。
不幸的是C#语言只支持名字空间,并不提供任何方式来详细说明集合。但实际上碰到这个问题的时候并不多,属于罕见问题。如果是设计希望第三方使用的组件类型。推荐在一个名字空间中定义类型,以便编译器轻松排除类型问题。事实上,应该使用公司全名(不是只取首字母)作为最高级名字空间名来降低冲突的可能性。你能看到Microsoft使用“Microsoft”作为名字空间。
在代码中写一个名字空间声明来创建名字空间是一件很简单的事情。就像下面这样:
namespace CompanyName { // CompanyName
class A { // CompanyName.A
class B { ... } // CompanyName.A.B
}
namespace X { // CompanyName.X
class C { ... } // CompanyName.X.C
}
}
注意名字空间是隐含的公共类型(public)。不能通过任何访问修饰符改变这一点。但可以在内部的名字空间中定义类型(不能在集合外面使用)或者在公共的名字空间中定义类型(能被任何集合访问)。名字空间只表示逻辑上的限制策略,可访问性和包装是通过将名字空间放入一个集合来完成的。
下一次的讨论中,我将阐述所有.NET编程人员必须掌握的简单数据类型、引用类型和数值类型。对于每一个.NET程序,透彻理解数值类型是非常重要的。
编程平台 篇3
关键词:TCP/IP 协议;网络编程;实验平台;设计
一、设计原理分析
创建网络编程实验的平台主要是为了向实验者提供一个网络编程进行开发调试的环境,降低编程开发实验的难度,提高网络编程实验的效率。网络编程设计的原理为,通过后端的运行程序搭建一个运行平台进行网络编程的实验,这个然后编写这个运行程序的主体框架,结合实验的主要目的及内容要求,在程序的主体框架中空出一些程序代码。通过函数接口的方式来完成实验所需要的代码。在进行网络编程的实验中,实验人员所完成的函数接口必须要保证接口清晰且变量明确,同时还要准确的描述函数功能,然后根据实验平台需要完成的函数编程,开发网络编程。
二、构建网络编程实验平台
网络编程实验平台的构建分为前端与后端,其中后端是实现整个平台的基础,它能够根据前段选择的实验目的及内容要求,来自动生成实验所需要的程序。后端在产生一个完整的网络编程实验程序后,能根据实验目的以及程序的框架组成等内容,合理删减程序框架中的程序模块,为实验人员提供出这些程序模块的函数接口、函数名称等内容。然后,实验平台的后端能够将空缺的函数接口、函数名称以及程序的结构等进行描述,并且发布到实验平台的前端。实验平台的前端能够将后端传递的网络编程代码通过虚拟程序调试环境完成网络编程的开发实验,并且,实验人员在这个虚拟环境中看到的网络编程界面与传统编程环境下所看到的界面是相同的。
前端包含的内容有开发接口、函数库、程序调试模块以及用户程序评价模块等内容。其中最重要的核心模块为调试环境以及程序开发接口。调试环境模块主要是为了辅助用户开发网络编程的顺利进行,结合程序开发接口的模块就能帮助用户清晰的观察网络编程实验中的所有函数。
三、网络编程实验平台的后端设计
我们进行网络编程实验主要是帮助实验人员进行网络编程的实验。过去网络编程实验都是实验人员根据实验的内容以及实验目的,由实验人员从零开始构建网络编程的整个程序框架,最后才能实现特定网络的编程功能。在以前的网络编程实验中,每一个网络的应用程序实现都要编写大量的基础功能网络代码,实验人员为了能够获得一个特定功能,需要开发相当大的基础源码才能实现实验目的,开发工作量大使得进度异常缓慢,无形中也增加了网络编程的实验难度。我们根据网络编程实验平台的设计原理,在实验时,通过系统生成网络编程应用所需要的基础代码,然后只需要实验人员开发关键模块的代码,就能实现特定的功能。
网络应用程序框架自动生成流程图
首先,我们通过用户所选取的网络编程实验功能,自动生成编程实验功能相关的程序,然后描述程序的抽象功能,根据程序功能的抽象描述,我们能够在实验的数据库中提取出相关的程序框架及程序流程,同时,在提取程序流程时又能自动提取出函数库中的函数体,构成了目标程序的框架,最后输出实验形成的程序框架。
基本函数关系的结构一般都类似与树状,最底层的函数体也是最基本的函数体,它们所完成的操作也都是单一的原子操作;在进入到上一层的函数体后,它们又可以进行更高级的操作。这些函数的定义都是设计人员在设计的初期完成的。在编程实验的后期运行中,用户还能够对基本函数的定义自行添加。用户能添加的基本函数粒度包括所有的基本函数,并且也包含用户自行定义的基本函数。
总结:传统的网络编程实验需要花费大量的人力及时间,并且实验效果也很一般,我们通过对网络编程中的程序代码的简化,能够帮助网络编程实验人员解放大量的工作,更多的工作放到开发特定功能代码上。同时,新的网络编程实验平台的辅助开发模块实验效果非常好,具有很好的应用前景。
参考文献:
[1] 杨 华,杨松岸,黄修超. 《以 TMS320C6205为核心的MPEG-4编码器的设计与实现》[J].《通信技术》,2003,(11):1-2.
编程平台 篇4
我们把Scratch软件引入信息技术课堂,开展游戏化的程序设计教学, 目的就是促进小学生编程思维的发展。但在开展中我们也碰到了许多问题,如缺少合适的教学内容,缺少分类指导,缺少展示平台,缺少交流反馈,缺少互相评价,缺少辅导时间,缺少学生人数等。所以,迫切需要教师在教学中运用新的理念和方法,探索出一条游戏化编程教学的作品创作之路,有效提升学生的编程能力。
选择有趣的教学内容是游戏化编程教学的核心
目前,Scratch教学越来越受到老师们的关注,在新课程浙江摄影出版社《小学信息技术》六年级下册中,正式引入Scratch教学内容,但内容只有五个课时,只是让学生有个初步的了解。完整的Scratch软件操作教程不多见,市场上出现的还有一类Scratch书,是学校教师根据他们在课堂中开展Scratch教学实践的经验编写的。我校在刚引入Scratch教学时,初步挑选了几本, 有《Scratch与创意设计》《Scratch创意动画设计》和《边玩边学Scratch趣味游戏设计》等。我们从这些书中精选了包括基础知识、范例演示、作品创作等几个方面的学习内容,选取了一些有趣又好玩的小游戏。这些作品大部分来自于同龄人的创作, 难度并不大,非常适合学生们去模仿和练习,在初学时特别有效。我们还选取了一些并不完美的游戏作品,还有许多地方需要完善的有趣作品,让学生去分析,让他们提出问题,去学会解决问题和创造性地改进这些不足。
在初识Scratch时,我以《小猫快跑》 为主题,通过组织游戏内容开展教学。
一只威猛的狮子在森林深处巡视着自己的领地。突然,一只小猫闯进了它的领地,狮子勃然大怒,这时小猫发现情况不妙,它能否脱离险境呢?于是“小猫快跑” 的好戏上演了。
用游戏的内容,结合故事情境,让学生初步掌握移动、下一个造型、碰到边缘就反弹和重复执行等指令。
创建合理的分类作品是游戏化编程教学的基础
我们在教学时针对不同年级,选择学生容易接受的知识点。内容是学生比较感兴趣的,这样才能使学生得到更多的收获。
我们根据作品的性质,分为迷宫类、 射击类、益智类和动画类等。我们发现同一类别的作品,在创作过程中它们的指令代码也类似,可以起到举一反三的作用。 分类作品教学可以提升学生的思维能力, 巩固解决问题的能力,这样学生学起来相对轻松。对一些思维开阔的学生帮助更大, 有助于他们创造性地修改作品。
在利用Scratch教学中,学生对迷宫类和射击类的游戏最感兴趣,做出很多有意思的作品,如下表。
编排合适的校本教材是游戏化编程教学的手段
我校自2013年下半年开始着手准备Scratch校本教材的编写。根据Scratch主题研讨和课堂展示中积累的案例材料,认真筛选出适合学生掌握的课堂教学作品范例,旨在让所有学习Scratch的学生都能够对教学内容进行消化吸收。我们通过课堂实践,反复修改,合理编排,初步形成一本适合学生初学的Scratch校本教材。
整本校本教材分为三部分,由初级篇、 中级篇和高级篇组成,每部分有4课时内容, 案例的选取以故事性游戏化的形式呈现, 按照一定的梯度编排,整体上遵循由浅入深、由易到难的原则。教材中呈现的案例全部采用Scratch2.0界面,指令、按钮等图示更清晰。教材中还涉及利用Scratch进行画图和运用变量进行算法设计的高级技巧, 与嘉兴市青少年信息学竞赛相结合,拓宽了学生的视野,有效地培养了编程思维。
搭建丰富的展示平台是游戏化编程教学的保障
和课堂教学一样,展示和评价也是Scratch教学的重要组成部分。通过作品展评、竞赛等多种形式激发学生的表现欲,激励更多的学生投身到这项有意义的活动中来。Scratch的官方网 站http://stats.scratch. mit.edu/,是个想象编程分享的平台。当学生完成自己的作品时,老师指导学生上传到Scratch学习网站上,和网站上世界各地的Scratch爱好者一起分享和交流,也是一个非常好的学习渠道。
我校也为学生搭建了一个Scratch专题网站http://fzpt.hyxyxx.com/scratch, 上面放了许多视频教程、课堂范例、作品欣赏、学生作品等资源。学生利用这个平台,自己就能找到学习的内容,进行操作实践,也可以相互欣赏作品。在这个平台的引导和激励下,学生的兴趣得到极大的提升。
平时,还建立QQ群、论坛等,加强老师和学生、学生和学生之间的联系。用Scratch进行作品创作,从中定会发现错误,听取别人意见,有新的想法,有无数问题自然产生,这是一个不断修改和完善的过程。
每学期我们开展为期一周的Scratch创意作品体验周活动。在向阳Scratch专题网站上展示大量的学生创意作品,邀请全校3 ~ 6年级的同学参加体验活动,充分感受Scratch带给我们的无限魅力,感受创意的无限精彩。通过一段时间的教学,Scratch创作已成为很多学生的最爱,学生创作的很多作品连我们这些老师也佩服不已。
编程平台 篇5
1 WinSock编程的基本流程
在TCP/IP网络中, 两个进程间相互作用的主要模式是客户机/服务器模式, 该模式的建立基于以下两点: (1) 非对等作用。 (2) 通信完全是异步的。客户机/服务器模式在操作过程中采取的是主动请示方式。面向连接 (TCP) 的典型过程如图1所示[1,2]。
2 CAsyncSocket类的简单介绍
微软公司开发的Visual C++是Windows平台下强有力的开发工具。VC++对网络编程的支持有socket支持, WinInet支持, MAPI和ISAPI支持等, 其中Windows Sockets API是TCP/IP网络环境下开发最为通用的API。为简化WinSock网络编程, 使用户专注于应用程序的算法设计, Microsoft的基本类库 (Microsoft Foundation Class, MFC) 提供了两个用于Winsock编程的类, 分别是CAsyncSocket类和CSocket类。这两个类在不同程度上对WinSock API函数进行了封装, 具有直接调用Sockets API的灵活性。CAsyncSocket类是从CObject类派生出来的, 在很低的级别上一对一封装了Windows Sockets API, 因此具有直接调用Sockets API的灵活性, 可以使用面向对象的方式进行Socket编程, CAsyncSocket类可以方便地调用其他MFC对象, 处理多个网络协议。与CSocket类相比, CAsyncSocket类有以下特点[3]。
2.1 CAsyncSocket类对象的创建
CAsyncSocket是一个异步非阻塞Socket封装类, CAsyncSocket的Create () 函数, 除创建了一个Socket以外, CAsyncSocket::Create () 的参数lEvent指明了想要处理的Socket事件, 关心的事件被指定以后, 这个Socket默认就被用作了异步方式。CAsyncSocket还创建了个CSocketWnd窗口对象, 并使用WSAAsyncSelect () 将这个SOCKET与该窗口对象关联, 以使该窗口对象处理来自Socket的事件 (消息) , 然而CSocketWnd收到Socket事件之后, 只是简单地回调CAsyncSocket::OnReceive () 等虚函数。所以CAsyncSocket的派生类, 只需在这些虚函数里添加发送和接收的代码, 除此外Create () 函数还调用Bind () 函数将Socket对象与指定的地址绑定。其函数原型为:
BOOL CAsyncSocket::Create (UINT nSocketPort=0, int nSocketType=SOCK_STREAM, long
在重载函数中都有一个参数nErrorCode, 为零则表示正常完成, 非零则表示错误。通过int CAsyncSocket::GetLastError () 可以得到错误值。参数nSocketPort为使用的端口号, 为零则表示由系统自动选择, 通常在客户端都使用这个选择。参数nSocketType为使用的协议族, SOCK_STREAM表明使用有连接的服务, SOCK_DGRAM表明使用无连接的数据报服务。参数lpszSocketAddress指定了IP地址, 可以使用点分法表示如192.168.0.28, 也可以使用默认值, 此时函数将默认绑定本机IP地址。
2.2 CAsyncSocket类的异步选择机制
在网络通讯中, 由于网络拥挤或数据量大的原因, 数据的收发不能立刻完成, 收发数据的函数因此不能返回, 从而出现阻塞现象。WinSock对有可能阻塞的函数提供了两种处理方式:阻塞和非阻塞方式。在阻塞方式下, 收发数据的函数在被调用后一直要到传送完毕或者出错才能返回。对于非阻塞方式, 函数被调用后立即返回, 传送完成后由 WinSock给程序发一个事先约定好的消息。使用 Windows Sockets实现 Windows网络程序设计的关键就是它提供了对网络事件基于消息的异步存取, 用于注册应用程序感兴趣的网络事件。Winsock过 WSAAsyncSelect () 动地设置套接字处于非阻塞方式, 注册一个或多个网络事件。当被提名的网络事件发生时, Windows应用程序的窗口函数将收到一个消息, 消息附带的参数指示被提名过的某一网络事件。WSAAsyncSelect 的原型如下:
int PASCAL FAR WSAAsyncSelect (SOCTET s, HWND hWnd, unsignedint wMsg, long lEvent) 它请求 Windows Sockets DLL 在检测到套接字上发生的网络事件时, 向窗口 hWnd发送一个消息。MFC在实现 CAsyncSocket 类时, 定义了一个内部类CSocket Wnd, 当使用 Create 函数产生Socket句柄时, 就 Attach这个Socket到一个窗口上, 并且CAsyncSocket的 DoCallBack函数为该窗口的回调函数。在此函数内根据不同的消息参数, 响应各个网络事件。
2.3 CAsyncSocket对网络事件的响应
在理解以上机制后, 再了解一下CAsyncSocket的通信流程。
CAsyncSocket 在AsyncSelect 函数中调用WSAAsyncSelect 函数注册感兴趣的网络事件。这样, 当一个网络事件发生时, 经过MFC的消息循环, 就可以由 CAsyncSocket 的 DoCAllBack 函数按事件的类型:FD_READ, FD_WRITE, FD_ACCEPT, FD_CONNECT 和 FD_CLOSE来分别调用OnReceive () , OnSend () , OnAccept () , OnConnect () 和OnClose () 函数。具体的对应关系如表1所示。
3 使用CAsyncSocket类的通讯流程
在理解了上述的机制后, CAsyncSocket的通信流程:客户方在使用CAsyncSocket::Connect () 时, 往往返回一个WSAEWOULDBLOCK的错误, 实际上这不应该算作一个错误, 它是Socket的提醒, 由于使用了非阻塞Socket方式, 所以操作需要时间, 不能瞬间建立。那么可以等待, 等待连接成功, 于是许多程序员就在调用Connect () 之后, Sleep (0) , 然后不停地用WSAGetLastError () 或者CAsyncSocket::GetLastError () 查看Socket返回的错误, 直到返回成功为止。这是一种错误的做法, 断言不能达到预期目的。事实上, 可以在Connect () 调用之后等待CAsyncSocket::OnConnect () 事件被触发。类似地, Send () 如果返回WSAEWOULDBLOCK错误, 在OnSend () 处等待, Receive () 如果返回WSAEWOULDBLOCK错误, 则在OnReceive () 处等待[3], 具体的内部通信流程如图2所示[4]。
4 使用CAsyncSocket编程的程序框架
在进行C/S编程之前, 需在定义应用程序行为的文件030 303.cpp中的InitInstance () 函数里调用AfxSocketInit () 函数来初始化Windows Sockets[5]。
(1) 服务器端
以public的方式从CAsyncSocket类派生新类CServerSock, 并重载OnAccept、OnReceive、OnSend函数。
函数重载完成后, 在主窗口构造新的CServeSock对象, 用来监听来自客户机的连接, 添加代码如下:
CServeSock m_ListenSock;//m_ListenSock为监听套接字
m_ListenSock.Create (m_Port, SOCK_STREAM, FD_ACCEPT|FD_READ|FD_WRITE|FD_CLOSE) )
m_ListenSock→Listen (int nConnectionBacklog=5) ;
函数Send () 的参数说明:
nConnectionBacklog:等待连接的最大队列长度。
此时服务器开始监听来自客户机的连接请求。
(2) 客户机端
以public的方式从CAsyncSocket类派生新类CClientSock, 与服务器端类似, 重载OnReceive () 、OnSend () 函数。
已经搭建好使用CAsyncSocket类实现基于TCP协议的异步网络通讯的框架, 具体的应用程序可以在此基础上进行丰富与修改。
5 结束语
CAsyncSocket类为使用Socket提供了方便。建立Socket的WSAStartup过程和bind过程被简化成为Create过程, IP地址类型转换、主机名和IP地址转换的过程中许多复杂的变量类型都被简化成字符串和整数操作, 特别是CAsyncSocket类的异步特点, 完全可以替代繁琐的线程操作。MFC提供了大量的类库, 若能灵活地使用, 可大大提高编程效率。
参考文献
[1]RICHARD S W.TCP/IP解析.卷二:实现[M].北京:机械工业出版社, 2000.
[2]孙鑫, 余安萍.VC++深入详解[M].北京:电子工业出版社, 2006.
[3]郎锐, 罗发根.Visual C++网络通讯程序开发指南[M].北京:机械工业出版社, 2004.
[4]丁展, 刘海英.Visual C++网络通信编程实用案例精选[M].北京:人民邮电出版社, 2001.
编程平台 篇6
1 钩子过程概述
借助系统调用把一段消息处理程序加载到应用程序中, 称为钩子过程。在程序中钩子过程的主要功能是监控、截取并利用回调函数处理预先设定的消息。应用程序借助被称为HOOK的钩子过程就可以监控、截取处理程序员指定的事件和消息, 针对消息作出屏蔽或其他操作。从钩子作用角度的范围来看主要有进程内钩子过程与全局性钩子过程。全局钩子过程的实现在动态链接库中才能使用。提前在程序中设定的钩子函数可以Windows消息传递到指定窗口之前截取并获得消息的控制处理权。在回调函数中就可以对修改处理截获的消息, 也可以使消息不再继续传递。
当我们设计HOOK程序时, 在操作系统的应用程序自动创建一个HOOK过程链, HOOK链的节点是各个消息的钩子过程函数。链首是最后一次安装的钩子函数, 链尾是最初安装的钩子函数, 钩子感兴趣的消息依次经过HOOK链的每个节点检查, 连首的钩子首先获得控制权, 其次是第二个, 直至最后一个HOOK过程。钩子处理函数称为回调函数。
2 HOOK过程初始化和释放
链首的钩子过程被操作系统调用截取处理消息。这样, 把回调函数放在链首就可以达到设置钩子过程的目的。Windows提供了一个系统API函数初始化HOOK过程函数到钩子链首Set Windows H ook Ex () 。Set Windows Hook Ex () 函数在MSDN中的说明:
第一个参数id Hook指定了要初始化钩子过程函数的种类, 例如鼠标钩子Mouse Proc, 键盘钩子Key Board Proc;第二个参数lpfn是钩子过程函数的函数指针;第三个参数h Mod则指向动态链接库的句柄, 这个动态链接库包含了钩子函数;第四个参数dw Thread Id指定钩子过程监控的某个线程, 该参数的取值为线程ID或为0, 前者表示监视特定的线程, 起到进程内部钩子的作用, 后者起全局性钩子过程的作用, 即监控当前运行的活动线程。如果返回值为NULL, 说明调用失败, 否则返回所安装钩子过程的句柄。
如果需要监视应用程序中的鼠标消息, 就需要定义鼠标的钩子过程的回调函数, 这个函数在MSDN中给出的原型是LRESULT CALLBACK Mouse Proc (int n Code, WPARAM w Param, LPARAM l Param) ;该函数返回值非0表示相应消息被屏蔽, 一般用return 1表示。其中w Param和l Param参数中存放了鼠标消息的信息。n Code小于0时, 将控制权交给HOOK链中的下一个钩子函数。HOOK链中的每个钩子或者处理消息或者将事件传递给下一个钩子。钩子之间传递消息借助Call Nest Hook Ex () 函数。钩子定义的末尾一般需要调用Call Next Hook Ex () 函数以避免引起未知的系统错误。Call Next Hook Ex () 函数的返回值是HOOK链中的下一个钩子的地址。
值得注意的是, 安装钩子会影响消息的正常传递, 进而对系统本身的安全性造成破坏, 因此在使用钩子过程结束后必须吧钩子过程从当前系统中释放。释放钩子的函数原型在MSDN中的声明如下。
BOOL Unhook Windows Hook Ex (HHOOK hhk) ;参数hhk指向待卸载的钩子句柄, 即先前钩子安装函数返回的钩子句柄。
3 鼠标钩子的简单示例
4 结语
编程平台 篇7
虚拟仪器技术以通用计算机为基础, 外加少量硬件设备, 就可完成信号的分析测量工作。与普通仪器相比, 虚拟仪器具有低成本, 多功能等优点。近几年虚拟仪器发展迅速, 目前全球已有很多家虚拟仪器供应商, 本文选用NI (美国国家仪器) 公司的虚拟仪器产品。
在虚拟仪器构建的测量分析系统中, 主要硬件设备是数据采集卡。NI公司的数据采集卡种类丰富, 简单易用, 能满足各种应用场合, 选用现成的数据采集卡可以省去很多硬件开发工作。NI公司开发的图形化编程软件LabVIEW将硬件驱动和一些简单的信号处理函数编写成一系列独立的VI (Visual Instrument) 模块, 既能实现与硬件的无缝连接, 又能进行简单的信号运算分析。同嵌入式系统开发相比, LabVIEW环境下的系统开发不必考虑如寄存器配置、存储空间分配等复杂问题, 开发工作变得如同软件仿真一样简单。
MathWorks公司的Matlab是一种公式化编程语言, 有十分丰富的库函数和工具箱、信号处理功能强大、但与硬件结合不够紧密;C语言使用广泛, 语法严谨、程序结构清晰、可移植性好、执行效率较高;LabVIEW的图形化编程语言 (G语言) 作为一种较新的编程语言, 目前还未被广泛使用。为了使各种编程语言能优势互补, 本文采用编程接口技术实现LabVIEW环境下多语言混合编程, 以充分发挥各种编程语言的长处。
1平台结构
图1列出了平台结构框图, 数据采集端由传感器和采集卡组成。传感器输出的模拟信号进入数据采集卡。在某些应用场合, 传感器和数据采集卡之间需要加上信号调理设备, 以实现多路复用、信号幅度调整、滤波等功能。
在“LabVIEW编程环境”下完成两项任务, 首先是配置数据采集卡并接收数据, 配置参数包括输入接线端配置、物理通道选择、采样时钟设置、缓冲区设置、每通道采样数设置等;其次是对数据流进行实时分配并处理。为了实现处理的连贯性, 采用NI定义的“生产者/消费者设计模式”[1], 该结构通过响应事件实现代码的异步执行, 同时不影响用户界面的响应速度。“生产者/消费者设计模式”是将数据采集和数据处理分别放在两个循环里单独执行, 数据采集循环每一次采集的若干个样点定义为一个采样帧, 数据处理循环每执行一次, 完成一个采样帧的分析。采集的数据用队列缓存。队列是一种数据存储结构, 遵循FIFO (First In First Out) 存取机制, 每个采样帧作为队列的一个元素由队列尾部入列, 数据处理循环不断地从队列头部取走元素直至取完, 取完后等待新采集的数据到来。因此, 在“生产者/消费者设计模式”下, 只要数据处理循环单次执行时间小于数据采集循环单次执行时间, 就可以实现连续的实时分析。“函数模块”包含供LabVIEW调用的核心算法, 通过编程接口技术实现参数的传递。函数模块的编写较自由, 兼容多种编程语言, 某些现有的代码几乎不用修改就可以直接使用。运算结果可以通过LabVIEW前面板输出, 也可以由“函数模块”直接输出。在某些对程序前面板有特殊要求的场合, 例如仪表面板等, 这时采用LabVIEW前面板作为输出界面更直观。
2LabVIEW与其他编程语言的接口
2.1 动态链接库接口和CIN (Code Interface Node)
动态链接库 (DLL) 是Windows操作系统的基础, 动态链接库通常都不能直接运行, 它们是一些独立的文件, 其中包含能被可执行程序或其他DLL调用来完成某项工作的函数。只有在其他模块调用动态链接库中的函数时, 它才发挥作用。LabVIEW支持动态链接库技术, 支持动态加载和隐式链接, 兼容标准调用约定和C调用约定。
下面以隐式调用为例说明LabVIEW和Visual C++的接口建立过程:首先在Visual C++中创建一个WIN32动态链接库或MFC类库并将函数导出[2], 然后选择LabVIEW“互联接口”菜单下的“调用库函数节点”, 指定动态链接库 (DLL) 文件和引入库文件的路径名称, 选择要调用的函数并配置参数, 参数与原函数形参类型要保持一致, 如果是数组, 则要求长度一致。此时在程序面板里可以看到“调用库函数节点”模块上的参数接线端, 最后连接需要传递的参数, 则可建立隐式调用模块。CIN节点[1]是专门用来调用C/C++代码的功能节点, 可以直接向VI中添加C/C++代码, 十分简便。
2.2 专用Matlab接口
LabVIEW提供了两种常用Matlab接口:第一种是MathScript节点[1], 在LabVIEW程序框图面板的编程菜单结构子菜单下可以找到MathScript节点, 在MathScript框内直接填写Matlab代码便能生成脚本, 由于脚本的执行需要调用Matlab软件脚本服务器, 因此必须安装具有许可证的Matlab 6.5或以上版本才能使用Matlab脚本节点。Matlab脚本节点仅适用于Windows操作系统, 目前MathScript还不支持所有的Matlab函数, 应用受到一定的限制。
第二种Matlab接口是使用调用节点 (ActiveX) 技术引用MLApp.DIMLApp对象[3], 从LabVIEW“互联接口”面板选择“调用节点”模块, 然后为该模块配置ActiveX类, 打开类列表, 如果PC上安装了具有许可证的Matlab 或MCR, 则可以看到名为“Matlab Application”的类, 对该类进行展开可以看到有几个对象, 选用MLApp.DIMLApp对象, 方法列表中的Excute方法是执行函数命令, Quit方法是结束函数命令。由于在Matlab工作区间中的数据是矩阵类型, 而在多数编程语言中只有数组类型没有矩阵类型, 数组和矩阵看似十分相似, 但传参时数组并不能代替矩阵。Putfullmatrix方法和Getfullmatrix方法解决了两者的转换问题, Putfullmatrix将实参数组变换成矩阵传入Matlab工作区间, Getfullmatrix将Matlab工作区间内的矩阵转换为变体 (一种变量类型) 传出。
图2为引用示例, 首先在Matlab下编写函数:function[b]=funtest (a) , 函数内容任意, 函数以m文件存在Matlab默认运行目录下。然后在LabVIEW中编写图2所示程序。程序中三个数组为函数的实参;a, b为Matlab工作区间中的矩阵, 是函数的形参。当程序执行时, 图中“数组”和“数组2”分别转换为矩阵的实部和虚部赋给a, “数组”和“数组2”的长度要一致。返回值是变体类型, 经过变体至数据转换后赋给“数组3”。
2.3 基于COM组件的接口技术
基于COM组件的接口技术适合于所有支持COM技术的编程工具。既然LabVIEW可以调用节点, 完全可以自己创建一个注册类然后在LabVIEW中调用。调用一般遵循这样一个过程:获取类引用、执行函数、结束函数、关闭类引用。循环运算时为了提高执行效率, 可以把获取类引用和关闭类引用放到循环外部。Matlab环境下生成可用的COM组件步骤如下[4]:
首先在Matlab中新建一个“Funtest.m”文件, 编写如下测试代码:
function[b]=Funtest (a)
b=sin (a) ;
启动Comtool工具箱 (Matlab 7.0版本提供了Comtool工具箱, 新版本的comtool已并入deploytool工具箱) , 新建一个工程, 自定义类名为“IFuntestclass”, 通过“Project”菜单下的“Addfiles”将Matlab函数文件 (funtest.m文件) 加入工程, 运行Build菜单下的Com Object, 此时便生成了一个后缀为.dll动态链接库文件, 然后在Windows命令行使用regsvr32命令完成该类的注册。LabVIEW引用程序如图3所示。
函数模块有三个输入接线端一个输出接线端, “nargout”为输出参数个数, 参数b有左右两个接线端, 依次对应初始值和返回值。注册类的函数在传参的时候有一定的局限:不支持数组类型的返回值, 例如图3中的返回值b若是数组, 则无法正确传给显示控件“输出”。这种情况下如果要观察数组b的值, 只能使用Matlab绘图函数将b绘制为曲线, 或将b的内容保存为数据文件。
3系统实现
在该信号处理平台上可以搭建多种实际系统, 此处以二进制频移键控 (2FSK) [5,6]信号解调为例进行演示。2FSK是常见的数字调制方式, 2FSK信号有两种载频 (fs和fm) 分别对应0符号和1符号。常见的2FSK解调方法有三种:非相干解调、相干解调、PLL-FSK解调[7]。此处采用非相干方式解调。非相干解调分为带通滤波、包络检波和抽样判决三个步骤[8]。
FSK信号由Agilent 3320A信号发生器产生, fs=10 kHz, fm=30 kHz, 信息传输速率Rb=1 Kb/s, 由于信号发生器直接提供电压信号, 故系统省去了图1中的传感器部分, 在实际通信系统中, 接收机前端的信号要经过适当调理再进行解调。采集卡选用NI公司的NI9215, 该采集卡输入信号峰值电平为±10 V, 最多可进行4个通道的同步数据采集, 采样率可达到100 KSPS, 量化精度为16 b。同时可通过USB-9162转接器实现与PC的USB端口互联。
数据采集卡采样率设为96 kB/s, 为了抑制共模干扰, 信号发生器输出端模拟信号通过差分方式连接到采集卡, 同时, 代码中“输入接线端设置”设为“差分方式”, 通道数设为1。在本系统中, 运算结果的延时约等于采样帧的时长, 因此, 采样帧越长实时性越差。增加采样帧的长度, 可以减少PC与采集卡的频繁通信, 提高了执行效率。要对运算延时和执行效率进行折衷, 必须选择合适的采样帧长度, 这里将采样帧长设为4 800点, 以采样帧为单位逐帧进行解调。
限于篇幅, 此处仅以2.2节中介绍的第二种Matlab编程接口为例进行演示。主程序图如图4所示。
图4中程序上半部分为数据采集, 其中包括数据采集通道配置、创建队列和数据采集循环;下半部分为数据处理循环, 其中包含 “FskDemod.vi”子VI, 即Matlab编写的核心算法, 子VI与Matlab函数模块接口如2.2所述。带通滤波器的设计是FSK解调算法的核心, 在Matlab中使用“fdatool”工具箱设计两个30阶的FIR带通滤波器, 中心频率分别为10 kHz和30 kHz, 提取滤波器系数, 再调用“filter”函数进行滤波, 实现过程十分简单。除了FSK解调, 本平台还适用于多种通信系统。虚拟仪器在通信领域正被越来越多的使用[9,10]。图5, 图6为某工作时刻LabVIEW前面板的绘图界面, 图5为2FSK信号波形, 图6为包络检波后的波形。为了便于展现, 图5, 图6只画出了一个采样帧的前192点的波形。包络检波结果再经过抽样判决便得到二进制数据流。
4结语
借助虚拟仪器稳定的硬件模块和灵活的软件环境, 为开发者设计了一个实用的信号处理平台。该平台上的系统开发硬件调试简单, 软件编写也十分自由。该平台非常适合用来快速搭建现场实验系统以及演示系统, 还可以担任嵌入式系统开发前期的评估和辅助工作。例如在该平台下用C语言编写并调试通过的算法可以快速移植到DSP系统。开发者可以根据实际需要选择更高端的数据采集卡, 快速搭建各种信号处理系统, 具有较好的实用价值。
摘要:将主要用于测控领域的虚拟仪器扩展作为一种通用信号处理平台。以NI的LabVIEW为框架, 以NI的数据采集卡为主要硬件设计了一个完整的信号处理平台, 在该平台上可以快速构建多种多样的信号处理系统, 实现数据的现场采集与处理。此外, 针对LabVIEW的一些不足, 平台提供了多种编程语言的接口, 使用者可以根据需要, 选用Matlab, C语言等填写核心算法, 从而发挥各种编程语言的优点, 增强平台的通用性且丰富了系统的功能。最后, 运用该平台搭建了2FSK信号解调系统, 验证了该平台的通用性和有效性。
关键词:虚拟仪器,数据采集,信号处理,混合编程
参考文献
[1]National Instrument Corporation.LabVIEW help[EB/CD].[S.l.]:National Instruments, 2009.
[2]孙鑫, 余安萍.Visual C++深入详解[M].北京:电子工业出版社, 2006.
[3]裴锋, 杨万生.LabVIEW与Matlab混合编程[J].电子技术应用, 2004 (3) :4-6.
[4]Mathworks Corporation.Matlab Builder for COM.Version1.1[EB/CD].[S.l.]:Mathworks Conporation, 2004.
[5]GLOVER I A, GRANT PETER M.Ditital communication[M].2nd ed.北京:机械工业出版社, 2004.
[6]COUCH Jr L W.Digital and analog communication systems[M].6th ed.北京:科学出版社, 2003.
[7]TOMASI Wayne.Electronic communications systems, fun-damentals through advanced[M].4th ed.北京:电子工业出版社, 2002.
[8]SKLAR Bernard.数字通信基础与应用[M].徐平平, 宋铁成, 叶芝慧, 译.2版.北京:电子工业出版社, 2007.
[9]DAS P K, KOCH D B.On the use of visual programminglanguages for communication system simulation[J].IEEEProceedings, 1991:158-162.
[10]WANG Hua, ZOU Yi.Software instruments based onsoftware radio concept[J].International Conferences onInfo-tech and Info-net2001, 2001, 29 (2) :459-463.
编程平台 篇8
关于脚本语言, 计算机用户并不陌生。按照微软的说法, 脚本只不过一种通过记事本程序或其它文本编辑器创建、并被保存为特定文件扩展名的普通文本文件。脚本语言是一种程序语言, 不同于通常C, C++等程序语言的是, 脚本语言是解释型语言, 不需要编译就可以执行, 而C, C++则需要编译成可执行程序才可以执行。脚本语言通常都有简单、易学、易用的特性, 因此在日常的计算机管理、维护中发挥着巨大的作用。
脚本语言常常被比喻作"胶水", 胶水的任务使用于把一些小的任务编排、组织在一起, 完成一项较大的任务。这些小的任务通常是操作系统的命令、接口, 或者其它脚本。脚本语言必须有"解释器", 才可以被翻译执行。
在Windows平台上, 脚本语言的发展也经历了几个阶段, 本文尝试就这几个发展阶段予以归纳、进行分析, 并对脚本编写的基本方法举例介绍。
1 批处理命令的编写
Windows平台下的脚本技术, 可以溯源到DOS批处理命令。DOS操作系统下, 由于以命令行方式工作, 只能以键盘敲入命令才能操作计算机, 为了避免某些需要不断重复敲入命令的情况, 计算机操作系统提供了“批处理” (batch operation) 的方式, 让计算机可以将整个流程的命令, 循序、逐行地编排为批处理文件, 若有相同的操作需要处理, 即可加载批处理文件而不需要再次重复敲入指令。
由于批处理对命令行方式工作的计算机系统操作者帮助甚大, 因此操作系统的命令处理器也不断加强功能, 尤其加入了许多程序语言的重要元素, 包括变量、循环、条件判断等等, 让计算机操作不只是循序地执行命令, 而能更精确地操控计算机系统的运作。
下面是一个批处理文件, 完成的功能是在一个指定的文本文件前面加入指定的内容。运行时, 把下列内容写入一个扩展名为*.bat的文件即可。
对批处理文件来说, 脚本所能调用的"小任务"只能是命令行指令, 在上述脚本中, copy, del, ren都是DOS命令, 脚本无非确定了命令的执行步骤。脚本是靠cmd.exe来解释执行的, 也就是命令行解释器。
2 使用VBScript对WSH编程
批处理工作的方式太简单, 功能也有限。在Windows98操作系统中, 微软推出了WSH (Windows Scripting Host, Windows脚本宿主) 的概念。WSH是一个基于32位Windows平台、并独立于语言的脚本运行环境, 在其中内置了VBScipt以及Jscrip语言的解释器。WSH为Windows的常见管理任务提供了若干个内置对象, 它还可以通过COM技术使用其他对象。WSH的功能更强大, 因为它提供了更多的可访问对象。
下面给出了一段用VBScript编写的脚本, 它的作用是新建一个文本文件, 并在其中写入一行文本。和批处理文件不同的是, 这段脚本调用的不是命令行的命令, 而是WSH的内置对象。
如果执行这段脚本, 把下列内容写入一个扩展名为*.vbs的文件, 然后就可以通过双击文件名执行。
WSH提供了包括文件系统、网络服务、系统管理等在内的多种对象, 通过对这些对象的操作, 可以完成计算机的日常管理的自动化, 在这些内置对象的帮助下, 我们就可以利用WSH充分发挥VBScript及JScript等脚本的强大威力, 极大地提高工作效率。
WSH还可以调用COM组件。下面这个脚本实现了修改主机的IP地址。
WMI (Windows管理规范) 利用COM技术提供了访问本地或远程计算机对象的一些编程接口。这个脚本利用了WMI的Win32_NetworkAdapterConfiguration类, 通过脚本调用它的EnableStatic方法就可以实现对IP地址和子网掩码的修改。
3 使用PowerShell编程
PowerShell是微软公司于2006年发布的新一代命令行交互式Shell (命令解析器) 和脚本系统管理工具。PowerShell将脚本可以控制的对象又一次加以扩展, 除了命令行命令, COM对象之外, 还可以利用.NET FrameWork类库 (FCL) 的强大功能, 帮助管理员完成计算机的自动化管理工作。
在XP操作系统下, PowerShell需要从微软网站下载安装。PowerShell是构建于.NET上的, 所以需要首先安装需要.NET FrameWork。下面这段代码利用.NET对象System.Drawing以及System.Windows.Forms, 实现了一个Form, 并在Form上显示了一幅图像。如果想运行此代码, 需要在C:盘根目录下放置文件名为0001.jpg的图片, 并正确安装PowerShell。
PowerShell编程有自己的语法规则, 但是总体来说, 仍然是非常简单的。它的强大之处在于它保持批处理, WSH既有强大功能的同时, 可以处理种类更多的对象, 尤其是.NET框架的类库。.NET框架包含了十分庞大的类, PowerShell利用.NET框架所实现的脚本功能将是批处理、WSH等实现的功能所不能想象的。
4 结束语
脚本的简单易用、功能强大, 为计算机的日常管理提供了有力的工具。本文分析了Windows平台下利用脚本进行编程的几种方法, 还给出了一些例程, 比较了几种编程方法的不同特点。
摘要:脚本以其易用、功能丰富的特点, 在计算机日常管理中发挥着重要作用。介绍了Windows脚本编程的几种常用方法, 并比较了这些方法的不同特点, 给出了不同方法实现的脚本例程。
关键词:脚本,批处理,Windows脚本宿主,PowerShell
参考文献
[1]陈喜春, 吴昊.用脚本实现计算机管理的自动化[J].电脑学习, 2010 (2) .
[2]邹县芳, 胡昆鹏.批处理在提高Windows管理效率中的神奇应用[M].北京:中国铁道出版社, 2008.
[3][美]LEE HOLMES.Windows PowerShell应用手册[M].赵松德, 王英群, 译.北京:机械工业出版社, 2009.
编程平台 篇9
《数控编程与加工技术》是数控技术及应用专业的核心课程, 经过多年的教学实践积累丰富的教学经验和教学资源。该课程资源基本上是采用PPT多媒体教学课件、现场实践操作演示和专门的精品课程网站的网络资源, 记录教师课堂上的所有教学内容和操作演示, 并以视频的形式保存供学生回放和复习。视频有着文本、图片等媒体所不具备的优势和特点, 可以向学生直观展示软件的操作过程, 可重复播放, 便于理解和记忆。然而, 传统的视频课程播放时长约为40-60分钟, 学生经常因为要学习一个很小的知识点而重复拖动时间滑块, 浪费宝贵的时间, 学生也很难集中精力去看, 很容易造成厌烦情绪, 也起不到相应的作用。
以麻省理工大学教学视频网、网易的视频公开课为代表的微视频在教育方面的研究相继出现。微视频教学资源随着教育界和商业界传播和共享课程知识的放大, 人们可以通过访问视频网站极其方便地学习各级各类学校的课程, 尤其是知名企业优质课程和体育、舞蹈等文化课程的教学视频。微视频以其精彩的内容、逼真的画面、较低的门滥和极强的交互性吸引着越来越多的受众关注。从国内外微视频的研究与分析可以发现, 微视频的研究到目前为止, 多侧重于微视频具有的交互性和娱乐性, 在教学领域的研究相对贫瘠, 通常用于一些文化基础课程比如像音乐鉴赏、诗歌等, 像数控技术这类对专业技能型的课程基本没有, 很多人也认为不是很适用于这些工科类的课程。
微视频教学资源平台的研究目标、研究内容、主要特色和创新之处。
1) 研究目标
针对《数控编程与加工技术》课程, 开展微视频学习资源的设计、开发与应用研究, 构建满足《数控编程与加工技术》实际教学情况需要的微视频教学平台;设计出具有实用性、可操作性, 能够提高学习效果, 并能激发学习者学习动机与兴趣的微视频学习资源, 为师生之间创造良好的互动交流条件, 同时也为工科类技能型综合课程教学改革提供借鉴和参考。
2) 研究内容
主要是《数控编程与加工技术》微视频教学资源平台在课程教学中的应用, 依据教学规律针对高职院校培养高素质技能型人才的特点, 利用各种技术手段开发满足实际教学需要的微视频教学平台、相关的配套微视频资源库以及具体教学应用方案, 具体如下:
(1) 分解重构《数控编程与加工技术》课程知识体系, 建立知识体系的关系网络模型。
根据课程标准, 将需要讲授的知识, 按慕课长约5-15分钟的要求, 划分为一个个小的知识点, 对每个知识点、知识点内容、难易程度、重要性等进行详细描述。以便于学生合理安排时间和精力, 也便于老师考核。重点建立各知识点间的关系网络模型, 将所有知识点进行碎片化、分块、分组、分群, 对梳理出来的每个小的知识点, 理清各知识点间的相互关系, 为学生提供提供灵活、便捷的多线程学习模式。
(2) 研究设计与构建满足我院《数控编程与加工技术》实际教学情况需要的微视频教学平台。
借助于湖南省教育厅推广的“世界大学城”的教师个人空间平台, 建立一个中心平台, 由课程协调人管理和维护。通过该平台发布课程概要、内容资源、每周话题、活动通知、组织教师介绍等课程信息, 以此组织整门课程的学习活动。平台中, 每节微课中除提供微视频外, 还开设与之相关的在线同步测试、学习攻略、课程讲义、答疑及评论专区, 便于学习者在课外时间完成针对知识点和概念的自主学习。
(3) 开发《数控编程与加工技术》微视频教学资源库。
选取课程部分内容与学院和企业的专家进行深度的探讨, 对该内容的微视频建设的具体方案, 涵盖的教学内容和教学知识点碎片化进行确认, 对照实际教学规律完成微视频教学资源的建设。微视频资源可以通过网络进行资源共享, 便于学生进行互动交流。由于每一个微视频都是针对某个独立的知识点进行编制, 都有一个明确的主题, 学生只要输入主题关键字, 便能调出相应的微视频。
(4) 研究如何利用微视频资源来促进课程教学模式改革, 提供高教学效果。
课程教学过程的安排合理高效地利用微视频来解决实际教学中的问题。本课题将选取部分内容, 在部分的数技专业班级的《数控编程与加工技术》课程教学中进行教学实践, 研究一套适合实际教学需要的微视频教学应用模式。
(5) 通过部分的实践, 将微视频教学应用模式逐步扩展到整个课程以及相关的专业课程的教学建设并申报学院的教改课程建设。
3) 微视频教学资源平台的创新之处
微视频教学资源平台是适应当前教学资源微型化、个性化、交互式的发展趋势根据现代高职学生的心理特征从专业技能学习的规律出发, 结合微型学习理论、富媒体教育、翻转课堂和课堂动态生成理论, 探讨《数控编程与加工技术》微视频—学习资源的设计、开发与应用研究。
指导思想创新:能力本位, 教学资源微型化, 符合专业技能知识学习的规律;
课题开发途径创新:企业专家、教师、学生携手研究与开发;
课题内容的选择创新: (1) 注重各知识点间的关系网络模型的建立。将所有知识点进行碎片化、分块、分组、分群, 对梳理出来的每个小的知识点, 理清各知识点间的相互关系, 为学生提供提供灵活、便捷的多线程学习模式。 (2) 借助网络这一新型教学平台, 满足学生的个性化学习需求, 不但能帮助学生查缺补漏、强化巩固知识, 而且能让学生随时随地进行学习。
相信经过不断的在教学实践中总结经验, 不断的完善和补充, 一定能够为高职工科类课程的教学改革提供良好借鉴。
参考文献
[1]苏岩.微视频发展历史研究[J].软件导刊, 2011 (11) :33-35.
[2]范福兰.基于交互式微视频教学资源教学模式的应用效果分析[J].现代教育技术, 2012 (22) :24-28.