版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、引言1.1开发背景成都理工大学金工实习基地实验室情况简介:本实验室主要是机械相关专业及部分非机械专业学生进行机械加工实习的场所,学生按提前的报名顺序分组同时进行机械加工实习,加工完成后指导老师要根据学生的实际实习表现及学生此次完成的机械产品给予相应的成绩,并登记存储以供以后处理。每位学生都各有一本本人机械实习成绩的成绩记录手册、该手册由金工基地管理员统一管理,由相应指导教师录入分数。这种方式只能应用于同时实习学生人数不多时,若实习学生人数较多这种方法比较杂乱,且学生成绩数据不易于长期保存和管理,也不易于后期的处理。本软件开发的目的正是为改变这种现状,从纯人工方式转变为用计算机软件来管理数据,可
2、以方便指导老师将每天实习学生的实习成绩输入计算机进行存储,不用查找每位学生的成绩记录手册,可以减轻指导老师的工作量,同时还可以应用计算机在数据处理方面的优势方便快速的对数据进行后期处理,例如:在每周或每学期结束时,实习主管要按学校的要求对本学期的学生成绩数据进行相应处理,比如:(1).查询没有按时完成本学期实习的学生名单,(2).计算学生实习平均成绩,(3).对本学期的实习情况进行统计以对下学期教学进行安排等。 每天实习的学生人数在100-200人次,即相应每天有100-200人次的学生数据要输入计算机储存,每天会有不同的课程同时进行,所以会有数位教师同时输入学生实习成绩,每学期的数据总量不是
3、很大,用计算机管理这些数据量会方便的多。1.2开发目标金工实习基地的学生数据用人工的方法进行处理比较繁杂,耗费了大量的人力和物力。为了改变这种现状,我们必须开发一种既能够满足教师管理学生成绩数据,又能够满足学生在局域网上方便的选课的系统。 教师通过该系统安排金工实习的时间、地点和人数,实习学生则通过局域网上教师公布的数据结合自己的时间选择课程。实习完毕,教师通过学生实习的表现及完成的金工产品给予相应的成绩,并且将成绩上传到本系统中,实习学生通过登陆局域网查看成绩。而管理员的职责是对教师、学生以及课程的数据进行宏观的管理。1.3项目提出的意义现在我国的大中专院校的学生成绩管理水平普遍不高,有的还
4、停留在纸介质基础上,这种管理手段已不能适应时代的发展,因为它浪费了了许多的人力和物力。在当今信息时代这种传统的管理方法必然被计算机为基础的信息管理系统所代替。如果本系统能被学校所采用,将会改变以前靠手工管理学生成绩的状况,可以树立良好的办学形象,提高工作效率。1.4系统开发所需的技术准备1.4.1硬件技术要求(1).处理器:Intel Pentium(R)4或更高(2).内存:512MB(3).硬盘空间:80MB1.4.2软件技术要求(1).操作系统:Windows 2000/XP(2).数据库:Microsoft office2000 Access1.4.3软件结构设计依照使用环境调查,可以
5、有以下两种方案:(1).用Excel储存数据,所有学生成绩数据由一台计算机统一存储,指导老师可以从不同计算机输入学生实习成绩,实习主管每学期所要进行的后期数据处理可以拷贝代任一计算机上进行,但是只能Excel软件本身所具有的一些功能去完成管理即数据处理任务,不能应用以下方案中数据库的一些优异的数据处理功能,处理费事费时。(2).考虑到可能有几位教师同时进行数据输入,自然设计成网络数据库,由统一的一台计算机管理数据,易于保证数据的一致性,每位指导教师可以在不同计算机上同时输入成绩数据而不会影响到其他指导教师,还可以为每位指导教师设置不同的帐户并分配不同的用户权限,这样可以使不同的操作也有易于相应
6、的管理防止出现混乱,实习主管学期末所要进行的后期数据处理都可以依靠相应处理软件进行,可以利用数据库所提供的一些优异的数据处理功能,方便数据处理降低后期数据处理工作难度。分析这两种方案很容易知道各自的优点与缺点,第二种方案明显优于第一种方案,可以满足本软件所要具有的功能并且很适合学校等非商业组织使用,所以本软件采用设计第二种方案。1.4.4实际方案选择1数据库选择在上述方案分析中我们已经选择了采用第二种方案。在选择数据库软件时,我们应该考虑到该数据库应该具有以下功能:存储学生成绩数据,可以对已存储在其中的数据进行检索查询、更改、删除等功能,而这些功能是所有数据库都有的,例如:Oracle,Mic
7、rosoft SQL,MySQL,Microsoft Office2000 Access等,一些数据库的高级功能在本系统中根本不需要,所以不用考虑一些企业级数据库,同时考虑本软件实际的运行条件以及成本,我认为采用Microsoft Office2000 Access比较合理。选用此数据库的原因有以下几点:(1).它是完全网络化的跨平台型的数据库系统;(2).它是具有客户端/服务器结构体系的分布式数据库管理系统;(3).它是Microsoft Office 软件中的一部分,一般说来,只要计算机装了Office就都有Access,因此使用方便;(4).使用简便、运行速度快、管理方便、安全可靠性强。
8、2系统开发工具的选择系统窗口以及界面方面选择HTML语言、Java语言,采用Microsoft自带的ASP服务器脚本开发环境进行开发,其具有以下功能:(1).访问服务器端的文件系统;(2).连接数据库并开发基于数据库的应用;(3).在应用中嵌入Active X、COM组件和Java Applet作为开发工具的ASP是微软于1996年11月推出的Web应用程序开发技术。在微软的文件中把ASP描述为:“一个服务器的脚本环境,在这里可以运行和生成动态的、交互的、高性能的Web服务器应用程序。”从这段描述可以看出,ASP既不是一种语言,也不是一种开发工具,而是一种技术框架。其主要功能是为生成动态的的交
9、互式的Web服务器应用程序提供一种功能强大的技术或方法。ASP的主要特性是能够把HTML、脚本、组件等有机的结合在一起,形成一个能够在服务器上运行的应用程序,并把按用户要求专门制作的标准HTML页面送给客户端浏览器。ASP与我们通常在客户端实现动态主页的技术如Java Applet,Active X,Javascript等,不同的是ASP的命令脚本语言都是在服务器上解释运行,执行后的结果产生HTML页面并送到浏览器。由于ASP是在服务器端解释执行的,开发者可以不必考虑浏览器是否支持ASP。同时,由于只是标准的HTML页面送到浏览器,在浏览器上看不到ASP程序,因此可以防止程序被盗取,保护了开发
10、者的利益。随着Internet的发展,信息的不断增加和变化,网站维护人员不得不经常修改他们的网页,静态Web站点的开发和维护变的越来越困难,特别是基于数据库驱动的Web站点更是如此。由于静态网页不能与浏览者进行有效的交互,使人们感到越来越乏味,所以开发动态网页或动态内容成了越来越多的站点所追求的目标。而ASP技术无疑成为正确的选择,它作为开发动态网页的工具有如下特点:(1).它具有学习快、设计快的特点,开发者在较短的时间内即可快速学会和快速设计出Web应用程序。(2).ASP的源代码在服务器端执行,代码保密性好。(3).集成于HTML中,无需编译链接可直接执行,使用文本编辑器如记事本即可设计。
11、(4).与浏览器无关,用户端只要使用常规可执行HTML代码的浏览器。(5).ASP是面向对象的。ASP的工作过程为:ASP技术直接建立于微软的Web服务器中,所有的微软Web服务器都支持ASP。Web服务器会自动把ASP程序码解释为HTML格式的主页内容,再送到用户端的浏览器显示。作为开发语言之一的HTML是一种专为WWW 网页显示及浏览而设计的简易标记语言,目前是WWW 上制作网页的标准语言格式。Tim BernersLee对HTML所下的定义是:“HTML是一种用以创造超文件的简易资料格式,其所创造出来的文件可在不同的操作平台间动”。由此可知,可移植性与简易性是HTML的两大特征。HTML
12、文件除了包含文字信息外,还可包括声音、影像等多媒体信息,而HTML的超链接除了网页内的链接, 也包括网页之间的链接。HTML的特点:(1).HTML的DTD设计主要是满足网上显示的需求。许多标签纯粹是用来指定网页的显示细节,例如:br是换行;hr是画一条平行线;b表示粗体字。(2).HTML有内建的样式(style)。HTML希望直接使用SGML标记来控制网页显示的样式,即HTML不需要有分离的样式表,这使得HTML更为简单易用,但缺点是灵活性差, 同样的文件内容只能设定一种显示样式。(3).HTML引用SGML的标记最简化特征。这是为了尽量减少HTML 文件标记的数量, 使HTML的标记更简
13、单,最明显的例子是结束标签(endtag)的省略。结束标签的省略虽然使得HTML的标记更为简单,但也成为描述文件结构时的限制,HTML文件中所有的段落标记在地位上都是平行的,省略了结束标签就无法描述“段落中又有段落”的结构。(4).HTML没有采用SGML的超链接机制。HTML的超链接是利用标签的“href”属性来指向Web上的任意文件,例如: 是一个外部链接是内部链接而内部链接的目标点是利用标 的“name”属性来指定,例如:作为开发语言的Java具有以下特点:(1).简单:容易编写程序,不需要长时间的训练,而能满足现代的需求。程序小型亦是简单的一种特性,使得软件体能够在小型机器上执行,基本
14、的解释器约为40K,若加上基本的程序库,约为215K。(2).面向对象的:面向对象的设计是一种重心在资料和接口的技巧,若以木头为比喻,一个面向对象的木头,它最主要的重点是即将要做的木椅子,其次才是所需要的工具;反之,一个以非面向对象的木头,它所关心的只是工具,最近的既插既用亦是面向对象设计的重点。(3).分布式:Java有一个很周全的程序库,且很容易地与HTTP和FTP等TCP/IP通讯协定相配合,Java应用程序能在网络上开启及连接使用物件,就如同透过URLS连接使用一个本地文件系统。(4).健壮的:由Java所编写出的程序能在多种情况下执行而具有其稳定性,Java 与C/C+最大不同点是J
15、ava有一个指针模型来排除内存被覆盖或毁损数据的可能性。(5).安全的:Java是被设计用于网络及分布式的环境中,安全性自必是一个重要的考虑,Java拥有数个阶层的互锁保护措施,能有效的防止病毒的侵入和破坏行为的发生。(6).高效能的:Java位元码迅速的能被转换成机器码,从位元码到机器码的效能几乎与C与C+没有区别。(7).动态的:Java比C或C+语言更具有动态性,更能适应时刻在变的环境,Java不会因程序库的更新,而必须重新编译程序。1.5系统与数据库的链接ASP(Active Server Pages)是Microsoft推出的一种用以取代通用网关接口的技术,利用它不仅能够产生动态的、
16、交互的、高性能的Web应用程序,而且可以进行复杂的数据库操作Access数据库隶属于Microsoft Office家族,取得较为容易,且界面和Office家族相似,容易掌握和使用(1)OLEDB创建Access连接较好的创建对Access数据库的连接的方法是使用原始OLEDB提供程序有2种面向Access的原始OLEDB提供程序它们是处理Access数据库的不同版本下面例子说明怎样用40版打开连接:注意:参数Data Source 提供通向Access数据库的路径(mdb文件)若不在连接字符串中提供所有连接信息,也可以将其保存在Data Link中(2)用ODBC 生成Access连接用OD
17、BC产生对Access数据库的连接,有3种选择可以把连接信息保存在Windows寄存器中、文件中或连接字符串中a.要把连接信息保存在Windows寄存器中,必须创建一个System DSN步骤如下: 启动ODBC 数据资源管理器此程序位于Windows控制面板中,标有ODBC Data Source 在ODBC数据资源管理器中选择标有System DSN的一项 单击Add,选择Access Driver,Finish 输入一个数据资源名称(如Access DSN)及对此连接的描述你可以选择创建一个新的Access数据库或选择标有Select的按钮,在现存Access数据库中选择(注意,单击Ad
18、vance,则提供几个高级选项例如,可以对Access数据库提供一个缺省的目录或缺省的注册名和密码)单击OK结束创建System DSN后,可以在位于同一台计算机的任何ASP中使用它例如,下面的脚本用名为Access DSN 的System DNS打开一个Access数据库连接:b. 创建File DSN 的过程与创建System DSN 过程相似要创建一个File DSN,启动ODBC 数据资源管理器,选择标有File DSN的一项,击Add,规定用来保存连接信息的文件名称和地址剩下的步骤与创建System DSN 相同创建File DSN后,可用下面脚本打开对一个Access数据库的连接c
19、. 若不希望创建System DSN 和File DSN,可以创建无DSN 连接,这必须在连接字符串中另外加入2个参数:DRIVER 和DBQ:上述程序主要功能是验证登陆数据,如果未输入登陆数据,系统将报错。5.3 管理员管理首页源程序如下:function StopScroll()if(Timer!=null)clearTimeout(Timer)function showsubmenu(sid)Which El = eval(submenu + sid);if (whichEl.style.display = none)eval(submenu + sid + .style.display
20、=;);elseeval(submenu + sid + .style.display=none;);5.4学生选课界面学生通过登陆界面进入系统后,和管理员登陆系统的界面类似,首先也是显示学生所能做的功能导航链接。当学生进行选课操作的时候,首先显示所能够选择的课程列表。为此,我们设计了显示课程列表的界面。在该界面中,需要包括如下信息:课程号、课程名、成绩、预选课程、所在系。还应该提供对课程操作的入口,包括选课框,即所说的选课。源程序如下:sql1=select * from Stu where SId=&Session(StuID)&set rs1= server.createobject(a
21、dodb.recordset) rs1.open sql1,conn,1,3sql=select * from StuMark where SId=&Session(StuID)&set rs = server.createobject(adodb.recordset) rs.open sql,conn,1,3rs.pagesize = 2if rs.eof thenrs_total = 0elsers_total = rs.recordcountend ifdim pagenogetpageno = trim(request(pageno)if(getpageno = )thenpageno
22、 = 1elsepageno = getpagenoEnd ifif(not rs.eof)thenrs.absolutepage = pagenoend if(rs.eof)then else repeat_rows = 0 while(repeat_rows rs.pagesize) and (not rs.eof)Sql_2 = Select LName from Lesson Where ID =&trim(rs(CId)& Set rs_2 = conn.Execute(Sql_2)If(rs_2.Eof)Thentemp = 无Elsetemp = rs_2(LName)End I
23、fResponse.Write(Server.Htmlencode(temp)rs_2.CloseSet rs_2 = Nothing if rs(Remarks) then response.Write rs(Remarks) else response.Write(无)5.5教师登陆界面 教师登录后进入教师界面后,取得了所教班级和课程列表、取得了预选某课程的所有学生以及接收学生操作。因此根据这些功能的需要,我们逐一实现了这些功能。 教师查看班级和课程列表之后,教师就要查看每个班级对应课程的所有学生,然后和管理员协商然后决定接收那些学生上课。 教师授课完毕后,根据实习学生的实际表现,在系统中
24、给予学生以相应的实习成绩。源代码如下:function aa(Dir)tt.doScroll(Dir);Timer=setTimeout(aa(+Dir+),100)/这里100为滚动速度function StopScroll()if(Timer!=null)clearTimeout(Timer)function showsubmenu(sid)whichEl = eval(submenu + sid);if (whichEl.style.display = none)eval(submenu + sid + .style.display=;);elseeval(submenu + sid +
25、 .style.display=none;);第六章、 结论通过对系统进行反复的修改和测试,金工实习基地选课系统的主要功能得以成功实现。系统的成功实现说明:金工实习基地的教学工作完全可以通过计算机进行处理,这必将推动金工实习基地的教学管理信息化的进一步发展,对整个学校的教学管理工作将起到积极的示范作用。在整个系统的设计过程中,自己遇到了很多困难。当拿到这个论题时,我决定用Visual C+作为系统程序的开发工具,用Microsoft SQL作为系统数据库的开发工具,因为当时对这两个软件的开发语言比较熟悉。但是在系统的开发过程中,我发现虽然Visual C+语法层次清晰、开发程序比较方便,但是与
26、网络兼容性以及数据库的接口问题处理起来比较复杂。因此,我改变了系统程序的开发工具,决定用和数据库连接比较方便的Microsoft 自带的技术框架ASP作为开发工具,其主要使用HTML语言和Java语言作为开发语言,而这两种语言在网络上有很好的兼容性。考虑到安装软件的烦琐,我决定用Office 自带的数据库Access作为数据库开发软件,但是事实证明这个决定是明智的,数据库Access与ASP也很容易链接和交互。当然,一下子改变开发工具对于自己是个艰难的决定,因为自己已经用前面的开发工具做了大量的工作。在这个过程中,指导教师朱江老师及时的纠正了我选用开发工具的错误,使自己迷途知返,才能顺利的完成
27、整个毕业设计。致谢自己的论文终于可以提交了,看着近15000 字的论文,不禁可以轻松一下了。很感谢我的毕业设计得到了指导教师朱江老师的大力支持,也同时给了我悉心的指导,使我全心完成本次论文。还有在论文制作过程中的到了周仲礼老师,王新庄老师等的诸多建议和热情支持和关怀,鼓舞。在这里表示特别感谢。工科论文写作是一个需要技术和逻辑的创作,所以感谢我的室友和研究生朋友以及外教Mary等为我论文写作提供帮助和关心鼓励,使我顺利的写完论文。也感谢每一个看到我的论文的老师和朋友,因为你们的阅读使我的论文散发了生命力,由于时间关系和仓促,还希望得到各位智者的恳切批评与指点。参考书目(1)徐彤.ASP实战锦囊.
28、机械工业出版社.2001(2)杨威.ASP3.0网络开发技术.人民邮电出版社.2000(3)李世杰.ASP网页设计手册.清华大学出版社.1999(4)赵莉.ASP3.0网站编程与实例演练.西安电子科技大学出版社.2000(5)董长虹.ASP动态网站建设.国防工业出版社.2002(6)宣小刚.ASP数据库系统开发实例导航.人民邮电出版社.2003(7)李春葆.Access数据库程序设计.清华大学出版社.2005(8)范国平.Access 2000数据库系统开发实例.人民邮电出版社.2002(9)张兴庭.ASP信息管理系统开发实例导航.电子工业出版社.2004(10)彭澎.管理信息系统.机械工业出
29、版社.2003(11)Richard Anderson .ASP 3.0.机械工业出版社.2001(12)Helen Feddema .精通Microsoft Access.清华大学出版社.2002附录资料:不需要的可以自行删除C语言中如何获取时间?精度如何?1 使用time_t time( time_t * timer ) 精确到秒2 使用clock_t clock() 得到的是CPU时间精确到1/CLOCKS_PER_SEC秒3 计算时间差使用double difftime( time_t timer1, time_t timer0 )4 使用DWORD GetTickCount() 精确
30、到毫秒5 如果使用MFC的CTime类,可以用CTime:GetCurrentTime() 精确到秒6 要获取高精度时间,可以使用BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency)获取系统的计数器的频率BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount)获取计数器的值然后用两次计数器的差除以Frequency就得到时间。7 Multimedia Timer FunctionsThe following functions are used with mul
31、timedia timers.timeBeginPeriod/timeEndPeriod/timeGetDevCaps/timeGetSystemTime/*/用标准C实现获取当前系统时间的函数一.time()函数time(&rawtime)函数获取当前时间距1970年1月1日的秒数,以秒计数单位,存于rawtime 中。#include time.hvoid main ()time_t rawtime;struct tm * timeinfo;time ( &rawtime );timeinfo = localtime ( &rawtime );printf ( 007The current
32、 date/time is: %s, asctime (timeinfo) );exit(0);=#include - 必须的时间函数头文件time_t - 时间类型(time.h 定义是typedef long time_t; 追根溯源,time_t是long)struct tm - 时间结构,time.h 定义如下:int tm_sec;int tm_min;int tm_hour;int tm_mday;int tm_mon;int tm_year;int tm_wday;int tm_yday;int tm_isdst;time ( &rawtime ); - 获取时间,以秒计,从19
33、70年1月一日起算,存于rawtimelocaltime ( &rawtime ); - 转为当地时间,tm 时间结构asctime ()- 转为标准ASCII时间格式:星期 月 日 时:分:秒 年二.clock()函数,用clock()函数,得到系统启动以后的毫秒级时间,然后除以CLOCKS_PER_SEC,就可以换成“秒”,标准c函数。clock_t clock ( void );#includeclock_t t = clock();long sec = t / CLOCKS_PER_SEC;他是记录时钟周期的,实现看来不会很精确,需要试验验证;三.gettime(&t); 据说tc2.
34、0的time结构含有毫秒信息#include#includeint main(void)struct time t;gettime(&t);printf(The current time is: -:d:d.dn,t.ti_hour, t.ti_min, t.ti_sec, t.ti_hund);return 0;time 是一个结构体, 其中成员函数 ti_hund 是毫秒。四.GetTickCount(),这个是windows里面常用来计算程序运行时间的函数;DWORD dwStart = GetTickCount();/这里运行你的程序代码DWORD dwEnd = GetTickCou
35、nt();则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位这个函数只精确到55ms,1个tick就是55ms。五.timeGetTime()t,imeGetTime()基本等于GetTickCount(),但是精度更高DWORD dwStart = timeGetTime();/这里运行你的程序代码DWORD dwEnd = timeGetTime();则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位虽然返回的值单位应该是ms,但传说精度只有10ms。=/*Unix#unix时间相关,也是标准库的/*1.timegm函数只是将struct tm结构转成t
36、ime_t结构,不使用时区信息;time_t timegm(struct tm *tm);2.mktime使用时区信息time_t mktime(struct tm *tm);timelocal 函数是GNU扩展的与posix函数mktime相当time_t timelocal (struct tm *tm);3.gmtime函数只是将time_t结构转成struct tm结构,不使用时区信息;struct tm * gmtime(const time_t *clock);4.localtime使用时区信息struct tm * localtime(const time_t *clock);1
37、.time获取时间,stime设置时间time_t t;t = time(&t);2.stime其参数应该是GMT时间,根据本地时区设置为本地时间;int stime(time_t *tp)3.UTC=true 表示采用夏时制;4.文件的修改时间等信息全部采用GMT时间存放,不同的系统在得到修改时间后通过localtime转换成本地时间;5.设置时区推荐使用setup来设置;6.设置时区也可以先更变/etc/sysconfig/clock中的设置再将ln -fs /usr/share/zoneinfo/xxxx/xxx /etc/localtime 才能重效time_t只能表示68年的范围,即
38、mktime只能返回1970-2038这一段范围的time_t看看你的系统是否有time_t64,它能表示更大的时间范围/*windows#Window里面的一些不一样的/*一.CTime () 类VC编程一般使用CTime类 获得当前日期和时间CTime t = GetCurrentTime();SYSTEMTIME 结构包含毫秒信息typedef struct _SYSTEMTIME WORD wYear;WORD wMonth;WORD wDayOfWeek;WORD wDay;WORD wHour;WORD wMinute;WORD wSecond;WORD wMilliseconds
39、; SYSTEMTIME, *PSYSTEMTIME;SYSTEMTIME t1;GetSystemTime(&t1)CTime curTime(t1);WORD ms = t1.wMilliseconds;SYSTEMTIME sysTm;:GetLocalTime(&sysTm);在time.h中的_strtime() /只能在windows中用char t11;_strtime(t);puts(t);/*获得当前日期和时间CTime tm=CTime:GetCurrentTime();CString str=tm.Format(%Y-%m-%d);在VC中,我们可以借助CTime时间类,
40、获取系统当前日期,具体使用方法如下:CTime t = CTime:GetCurrentTime(); /获取系统日期,存储在t里面int d=t.GetDay(); /获得当前日期int y=t.GetYear(); /获取当前年份int m=t.GetMonth(); /获取当前月份int h=t.GetHour(); /获取当前为几时int mm=t.GetMinute(); /获取当前分钟int s=t.GetSecond(); /获取当前秒int w=t.GetDayOfWeek(); /获取星期几,注意1为星期天,7为星期六二.CTimeSpan类如果想计算两段时间的差值,可以使用
41、CTimeSpan类,具体使用方法如下:CTime t1( 1999, 3, 19, 22, 15, 0 );CTime t = CTime:GetCurrentTime();CTimeSpan span=t-t1; /计算当前系统时间与时间t1的间隔int iDay=span.GetDays(); /获取这段时间间隔共有多少天int iHour=span.GetTotalHours(); /获取总共有多少小时int iMin=span.GetTotalMinutes();/获取总共有多少分钟int iSec=span.GetTotalSeconds();/获取总共有多少秒三._timeb()
42、函数_timeb定义在SYSTIMEB.H,有四个fieldsdstflagmillitmtimetimezonevoid _ftime( struct _timeb *timeptr );struct _timeb timebuffer;_ftime( &timebuffer );取当前时间:文档讲可以到ms,有人测试,好象只能到16ms!四.设置计时器定义TIMER ID#define TIMERID_JISUANFANGSHI 2在适当的地方设置时钟,需要开始其作用的地方;SetTimer(TIMERID_JISUANFANGSHI,200,NULL);在不需要定时器的时候的时候销毁掉时
43、钟KillTimer(TIMERID_JISUANFANGSHI);对应VC程序的消息映射void CJisuan:OnTimer(UINT nIDEvent)switch(nIDEvent)#如何设定当前系统时间windowsSYSTEMTIME m_myLocalTime,*lpSystemTime;m_myLocalTime.wYear=2003;m_myLocalTime.wM;m_myLocalTime.wDay=1;m_myLocalTime.wHour=0;m_myLocalTime.wMinute=0;m_myLocalTime.wSec;m_myLocalTime.wMill
44、isec;lpSystemTime=&m_myLocalTime;if( SetLocalTime(lpSystemTime) ) /此处换成 SetSystemTime( )也不行MessageBox(OK !);elseMessageBox(Error !);SYSTEMTIME m_myLocalTime,*lpSystemTime;m_myLocalTime.wYear=2003;m_myLocalTime.wM;m_myLocalTime.wDay=1;lpSystemTime=&m_myLocalTime;if( SetDate(lpSystemTime) ) /此处换成 SetS
45、ystemTime( )也不行MessageBox(OK !);elseMessageBox(Error !);本文来自CSDN博客,转载请标明出处:HYPERLINK /khuang2008/archive/2008/12/09/3483274.aspx/khuang2008/archive/2008/12/09/3483274.aspx一种制作微秒级精度定时器的方法当使用定时器时,在很多情况下只用到毫秒级的时间间隔,所以只需用到下面的两种常用方式就满足要求了。一是用SetTimer函数建立一个定时器后,在程序中通过处理由定时器发送到线程消息队列中的WM_TIMER消息,而得到定时的效果(退
46、出程序时别忘了调用和SetTimer配对使用的KillTimer函数)。二是利用GetTickCount函数可以返回自计算机启动后的时间,通过两次调用GetTickCount函数,然后控制它们的差值来取得定时效果,此方式跟第一种方式一样,精度也是毫秒级的。用这两种方式取得的定时效果虽然在许多场合已经满足实际的要求,但由于它们的精度只有毫秒级的,而且在要求定时时间间隔小时,实际定时误差大。下面介绍一种能取得高精度定时的方法。在一些计算机硬件系统中,包含有高精度运行计数器(high-resolution performance counter),利用它可以获得高精度定时间隔,其精度与CPU的时钟频
47、率有关。采用这种方法的步骤如下:1、首先调用QueryPerformanceFrequency函数取得高精度运行计数器的频率f。单位是每秒多少次(n/s),此数一般很大。2、在需要定时的代码的两端分别调用QueryPerformanceCounter以取得高精度运行计数器的数值n1,n2。两次数值的差值通过f换算成时间间隔,t=(n2-n1)/f。下面举一个例子来演示这种方法的使用及它的精确度。在VC 6.0 下用MFC建立一个对话框工程,取名为HightTimer.在对话框面板中控件的布局如下图:其中包含两个静态文本框,两个编辑框和两个按纽。上面和下面位置的编辑框的ID分别为IDC_E_TE
48、ST和IDC_E_ACTUAL,通过MFC ClassWizard添加的成员变量也分别对应为DWORD m_dwTest和DWORD m_dwAct. “退出”按纽的ID为IDOK,“开始测试”按纽ID为IDC_B_TEST,用MFC ClassWizard添加此按纽的单击消息处理函数如下:void CHightTimerDlg:OnBTest()/ TODO: Add your control notification handler code hereUpdateData(TRUE); /取输入的测试时间值到与编辑框相关联的成员变量m_dwTest中LARGE_INTEGER freque
49、nce;if(!QueryPerformanceFrequency( &frequence) /取高精度运行计数器的频率,若硬件不支持则返回FALSEMessageBox(Your computer hardware doesnt support the high-resolution performance counter,Not Support, MB_ICONEXCLAMATION | MB_OK);LARGE_INTEGER test, ret;test.QuadPart = frequence.QuadPart * m_dwTest / 1000000; /通过频率换算微秒数到对应的
50、数量(与CPU时钟有关),1秒=1000000微秒ret = MySleep( test ); /调用此函数开始延时,返回实际花销的数量m_dwAct = (DWORD)(1000000 * ret.QuadPart / frequence.QuadPart ); /换算到微秒数UpdateData(FALSE); /显示到对话框面板其中上面调用的MySleep函数如下:LARGE_INTEGER CHightTimerDlg:MySleep(LARGE_INTEGER Interval)/ 功能:执行实际的延时功能 / 参数:Interval 参数为需要执行的延时与时间有关的数量 / 返回值
51、:返回此函数执行后实际所用的时间有关的数量 / LARGE_INTEGER privious, current, Elapse;QueryPerformanceCounter( &privious );current = privious;while( current.QuadPart - privious.QuadPart Interval.QuadPart )QueryPerformanceCounter( t );Elapse.QuadPart = current.QuadPart - privious.QuadPart;return Elapse;注:别忘了在头文件中为此函数添加函数声
52、明。至此,可以编译和执行此工程了,结果如上图所示。在本人所用的机上(奔腾366, 64M内存)测试,当测试时间超过3微秒时,准确度已经非常高了,此时机器执行本身延时函数代码的时间对需要延时的时间影响很小了。上面的函数由于演示测试的需要,没有在函数级封装,下面给出的函数基本上可以以全局函数的形式照搬到别的程序中。BOOL MySleep(DWORD dwInterval)/ 功能:执行微秒级的延时功能 / 参数:Interval 参数为需要的延时数(单位:微秒) / 返回值:若计算机硬件不支持此功能,返回FALSE,若函数执行成功,返回TRUE / BOOL bNormal = TRUE;LAR
53、GE_INTEGER frequence, privious, current, interval;if(!QueryPerformanceFrequency( &frequence):MessageBox(NULL, Your computer hardware doesnt support the high-resolution performance counter,Not Support, MB_ICONEXCLAMATION | MB_OK); /或其它的提示信息return FALSE;interval.QuadPart = frequence.QuadPart * dwInter
54、val / 1000000;bNormal = bNormal & QueryPerformanceCounter( &privious );current = privious;while( current.QuadPart - privious.QuadPart interval.QuadPart )bNormal = bNormal & QueryPerformanceCounter( t );return bNormal;需要指出的是,由于在此函数中的代码很多,机器在执行这些代码所花费的时间也很长,所以在需要几个微秒的延时时,会影响精度。实际上,读者在熟悉这种方法后,只要使用Query
55、PerformanceFrequency和QueryPerformanceCounter这两个函数就能按实际需要写出自己的延时代码了。使用CPU时间戳进行高精度计时对关注性能的程序开发人员而言,一个好的计时部件既是益友,也是良师。计时器既可以作为程序组件帮助程序员精确的控制程序进程,又是一件有力的调试武器,在有经验的程序员手里可以尽快的确定程序的性能瓶颈,或者对不同的算法作出有说服力的性能比较。在Windows平台下,常用的计时器有两种,一种是timeGetTime多媒体计时器,它可以提供毫秒级的计时。但这个精度对很多应用场合而言还是太粗糙了。另一种是QueryPerformanceCount
56、计数器,随系统的不同可以提供微秒级的计数。对于实时图形处理、多媒体数据流处理、或者实时系统构造的程序员,善用QueryPerformanceCount/QueryPerformanceFrequency是一项基本功。本文要介绍的,是另一种直接利用Pentium CPU内部时间戳进行计时的高精度计时手段。以下讨论主要得益于Windows图形编程一书,第15页17页,有兴趣的读者可以直接参考该书。关于RDTSC指令的详细讨论,可以参考Intel产品手册。本文仅仅作抛砖之用。在Intel Pentium以上级别的CPU中,有一个称为“时间戳(Time Stamp)”的部件,它以64位无符号整型数的格
57、式,记录了自CPU上电以来所经过的时钟周期数。由于目前的CPU主频都非常高,因此这个部件可以达到纳秒级的计时精度。这个精确性是上述两种方法所无法比拟的。在Pentium以上的CPU中,提供了一条机器指令RDTSC(Read Time Stamp Counter)来读取这个时间戳的数字,并将其保存在EDX:EAX寄存器对中。由于EDX:EAX寄存器对恰好是Win32平台下C+语言保存函数返回值的寄存器,所以我们可以把这条指令看成是一个普通的函数调用。像这样:inline unsigned _int64 GetCycleCount() _asm RDTSC 但是不行,因为RDTSC不被C+的内嵌汇
58、编器直接支持,所以我们要用_emit伪指令直接嵌入该指令的机器码形式0X0F、0X31,如下:inline unsigned _int64 GetCycleCount() _asm _emit 0 x0F _asm _emit 0 x31 以后在需要计数器的场合,可以像使用普通的Win32 API一样,调用两次GetCycleCount函数,比较两个返回值的差,像这样: unsigned long t; t = (unsigned long)GetCycleCount(); /Do Something time-intensive . t -= (unsigned long)GetCycleC
59、ount(); Windows图形编程第15页编写了一个类,把这个计数器封装起来。有兴趣的读者可以去参考那个类的代码。作者为了更精确的定时,做了一点小小的改进,把执行RDTSC指令的时间,通过连续两次调用GetCycleCount函数计算出来并保存了起来,以后每次计时结束后,都从实际得到的计数中减掉这一小段时间,以得到更准确的计时数字。但我个人觉得这一点点改进意义不大。在我的机器上实测,这条指令大概花掉了几十到100多个周期,在Celeron 800MHz的机器上,这不过是十分之一微秒的时间。对大多数应用来说,这点时间完全可以忽略不计;而对那些确实要精确到纳秒数量级的应用来说,这个补偿也过于粗糙了。 这个方法的优点是: 1.高精度。可以直接达到纳秒级的计时精度(在1GHz的CPU上每个时钟周期就是一纳秒),这是其他计时方法所难以企及的。 2.成本低。timeGetTime 函数需要链接多媒体库winmm.lib,QueryPerformance* 函数根据MSDN的说明,需要硬件的支持(虽然我还没有见过不支持的机器)和KERNEL库的支持,所以二者都只能在Windows平台下使用(关于DOS平台下的高精度计时问题,可以参考图形程序开发人员指南,里面有关于控制定时器8
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电子产品配件销售合同三篇
- 班级评比活动的公平与公正计划
- 财务报表分析的重要性计划
- 金融产品投资合同三篇
- 新余学院《英语视听说》2021-2022学年第一学期期末试卷
- 新余学院《古代文学文献学》2022-2023学年第一学期期末试卷
- 西南医科大学《环境卫生学》2022-2023学年第一学期期末试卷
- 西南林业大学《居住区景观设计实验》2023-2024学年第一学期期末试卷
- 打螺丝的方法与技巧培训
- 西南交通大学《计算机图形学》2022-2023学年第一学期期末试卷
- 《国有企业管理人员处分条例》考试题库200题(含答案)
- 2024年高考语文天津卷及答案解析
- 昏迷的应急预案
- 小丑电影课件教学课件
- 广发银行广告合同
- 关于成立健康管理公司策划书
- 网络词汇论文开题报告
- GB/T 44694-2024群众性体育赛事活动安全评估工作指南
- 2024-2025学年七年级生物上册 第三单元 第一章 第一节 藻类、苔藓和蕨类植物说课稿 (新版)新人教版
- 三甲级综合医院绩效工资分配与考核实施方案
- 广东省广州市2023-2024学年七年级上学期期末考试数学试题(含答案)
评论
0/150
提交评论