MFC定时器使用

合集下载

定时函数的应用综述

定时函数的应用综述

定时函数的应用综述
当我们在衡量一个函数的运行时间,或者是判断一个算法的时间效率,或者在程序中我们需要一个定时器来定时执行一个特定的操作,如闹铃、时钟、多媒体、游戏动画等,都要用到时间函数。

编译器和时间函数为我们提供了很多时间函数,而这些函数的精度和用法也是各不相同的。

下面我们就对几种常见的定时函数进行比较、详述:
小结:以上提到的9种时间函数,由于他们的用处不同,其精度也有很大的差异,用户可以根据不同的需求选择合适的时间函数。

本文原始资料来源于网络,经个人加工形成,有些函数由于没有经过自己的测试,资料不一定准确,在选择了具体的函数之后,使用时尚须查阅该函数具体的资料。

我在程序中使用过的函数举例:
1:Sleep(1000)
//延时1s,多用于多线程程序中,如果在单个线程的程序中使用,有类似死机现象。

2、Timer事件:
该函数使用比较简单,但由于其精度与系统繁忙程度有关,在不需精确定时的场合应用非常好用,但如果需要精确定时,建议不要使用;
(1)定时setTimer(1,1000,NULL)//为定时器一设置一个1秒的周期
(2)在应用程序中添加OnTime()
{
CDC * pDC;
pDC->TextOut(100,100,“This is a test!”);
}//消息响应函数,在该函数中处理你想有响应的事件。

MFC onTime函数使用

MFC onTime函数使用

MFC onTime函数使用你需要在需要计时器的类的生成onTime函数:在ClassWizard里,选择需要计时器的类,添加WM_TIMER消息映射,就自动生成OnTime函数了。

介绍如下:总的来说, 这里面一共需要三个函数:SetTimer, KillTimer()和OnTimer().先请看SetTimer这个API函数的原型UINT_PTR SetTimer(HWND hWnd,// 窗口句柄UINT_PTR nIDEvent,// 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器UINT uElapse,// 时间间隔,单位为毫秒TIMERPROC lpTimerFunc// 回调函数);例如SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了于是SetTimer函数的原型变为:UINT SetTimer(UINT nIDEvent,UINT nElapse,void(CALLBACK EXPORT*lpfnTimer)(HWND,UINT ,YINT ,DWORD))当使用SetTimer函数的时候,就会生成一个计时器。

函数中nIDEvent指的是计时器的标识,也就是名字。

nElapse指的是时间间隔,也就是每隔多长时间触发一次事件。

第三个参数是一个回调函数,在这个函数里,放入你想要做的事情的代码,你可以将它设定为NULL,也就是使用系统默认的回调函数,系统默认认的是onTime函数。

这个函数怎么生成的呢?你需要在需要计时器的类的生成onTime函数:在ClassWizard里,选择需要计时器的类,添加WM_TIME消息映射,就自动生成onTime函数了。

然后在函数里添加代码,让代码实现功能。

每隔一段时间就会自动执行一次。

例:SetTimer(1,1000,NULL);1:计时器的名称;1000:时间间隔,单位是毫秒;NULL:使用onTime函数。

MFC中的SetTimer、ON_WM_TIME

MFC中的SetTimer、ON_WM_TIME
BEGIN_MESSAGE_MAP(CAssistantDlg, CDialog) ON_WM_TIMER() END_MESSAGE_MAP() 以上的定现函数如下所示: void CTestDlg::OnButtonStart() {
SetTimer(1,1000,NULL);//启动定时器1,定时时间是1秒 }
SetTimer(1,1000,(TIMERPROC)TimerProc);//用回调函数处理,此时对话框的消息处理函数不再处理。 }
void CTestDlg::OnButtonStop() {
KillTimer(1); //关闭定时器1。 }
void CTestDlg::OnTimer(UINT nIDEvent) { switch(nIDEvent) { case 1:
static int nTimer=0; CString strTmp=""; strTmp.Foimer++); CWnd *pWnd=GetDlgItem(IDC_STATIC_TIME); pWnd->SetWindowText(strTmp); 将Lable中设置新值,表明定时器已经工作。 break;
default: break;
} CDialog::OnTimer(nIDEvent);
}
回调函数的使用。 如果不想使用窗体的WM_TIMER消息函数处理,可以使用回调函数来取代,读者可以在上面例子的基础 上,增加一个回调函数,以证实前面的讨论。 首先,定义一个回调函数,回调函数的定义必须按照如下格式。 void CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime );

mfc 定时器用法

mfc 定时器用法

mfc 定时器用法
MFC定时器可以让程序在固定的时间间隔内执行某个任务或事件,使用起来非常方便。

下面是如何使用 MFC 定时器的步骤:
1. 在 MFC 应用程序的主窗口类中添加定时器成员变量:
UINT_PTR m_nTimerID;
2. 在 OnInitDialog 中初始化定时器:
m_nTimerID = SetTimer(1, 1000, NULL);
其中,1 表示定时器 ID,1000 表示定时器触发时间间隔(单位为毫秒),NULL 表示定时器消息处理函数为主窗口类的 OnTimer 函数。

3. 在主窗口类中添加 OnTimer 函数:
void CMyAppDlg::OnTimer(UINT_PTR nIDEvent)
{
if (nIDEvent == m_nTimerID)
{
// TODO: 在此处添加定时器任务代码
}
CDialog::OnTimer(nIDEvent);
}
其中,nIDEvent 表示定时器 ID,用于区分不同的定时器事件。

4. 在 OnClose 函数中销毁定时器:
KillTimer(m_nTimerID);
这样,当主窗口关闭时,定时器也会被销毁。

总之,MFC 定时器使用起来非常简单,只需要在程序中添加定时器成员变量、初始化定时器、编写定时器任务代码和销毁定时器即可。

利用定时器和双缓冲技术在MFC中绘制动画

利用定时器和双缓冲技术在MFC中绘制动画
关 键N : MF C 动 画 定 时器 双缓 冲 中图分 类号 : T P 3 l 1 . 1 I 文献 标识 码: A
文 章编 号: 1 0 0 7 - 9 4 1 6 ( 2 0 1 3 ) 0 8 — 0 1 2 9 一 O 1
个“ 动画 ” 菜单项 , 设置好对应 的I D。 第二步 , 向Chu i t u Vi e w类 中添 加一 个布 尔型 成员 变量 MFC 是微软公司推 出的软件开发架 构[ 1 l , 在MF C中绘 制动画 o n g h u a l f a g, 用 于表示是否显示动 画。 常见于各类软件 开发。 动 画绘制一种思路是利用循环语句加延迟函 d 第三 步 , 利用类向导创 建对 “ 动画” 菜单 项的响应 函数 。 该 函数 数 的方式[ 2 】 , 另外一种 思路就是利用定 时器口 1 定时更像 图片绘制动 的内容很 简单 , 如下所示 。 画。 后者在绘 制过程 中可 以响应其他事件 , 因此 应用十分广泛 。 i f ( d o n g h u a l f a g = = t r u e ) { 1 . 1定 时器技 术

_ 十 r 黪
f 敦字 技 术
设 计 开 发
利用定时器和双缓冲技术在 MF C中绘制动画
杜 小 甫
( 沈 阳城 市建设 学 院信 息 与控 制 工程 系 辽 宁沈 阳 1 1 0 1 6 7 )
摘 要: 对MF c中动 画绘制 涉及 到的 两个 重要技 术做 较全 面 的总结 和提 炼, 创 建 了一个通 用性 较 强的动 画绘制程 序框 架 。 首先 对MF C'  ̄定时 器 技 术和 双 缓冲技 术做 出深入 分析; 其 次创 建 一 个动 画绘制 程序 框 架; 最后 通过 几 个动 画程序验 证 该框 架 。 该程 序框 架 已经应 用在 实际工作 中, 证 明 该框 架是 精 炼有 效 g =f a l s e I

C#中的三种定时计时器Timer用法介绍

C#中的三种定时计时器Timer用法介绍

C#中的三种定时计时器Timer⽤法介绍在.NET中有三种计时器:1、System.Windows.Forms命名空间下的Timer控件,它直接继承⾃Componet。

Timer控件只有绑定了Tick事件和设置Enabled=True后才会⾃动计时,停⽌计时可以⽤Stop()⽅法控制,通过Stop()停⽌之后,如果想重新计时,可以⽤Start()⽅法来启动计时器。

Timer控件和它所在的Form属于同⼀个线程;2、System.Timers命名空间下的Timer类。

System.Timers.Timer类:定义⼀个System.Timers.Timer对象,然后绑定Elapsed事件,通过Start()⽅法来启动计时,通过Stop()⽅法或者Enable=false停⽌计时。

AutoReset属性设置是否重复计时(设置为false只执⾏⼀次,设置为true可以多次执⾏)。

Elapsed事件绑定相当于另开了⼀个线程,也就是说在Elapsed绑定的事件⾥不能访问其它线程⾥的控件(需要定义委托,通过Invoke调⽤委托访问其它线程⾥⾯的控件)。

3、System.Threading.Timer类。

定义该类时,通过构造函数进⾏初始化。

在上⾯所述的三种计时器中,第⼀种计时器和它所在的Form处于同⼀个线程,因此执⾏的效率不⾼;⽽第⼆种和第三种计时器执⾏的⽅法都是新开⼀个线程,所以执⾏效率⽐第⼀种计时器要好,因此在选择计时器时,建议使⽤第⼆种和第三种。

下⾯是三种定时器使⽤的例⼦:1、Timer控件设计界⾯:后台代码:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace TimerDemo{public partial class FrmMain : Form{//定义全局变量public int currentCount = 0;public FrmMain(){InitializeComponent();}private void FrmMain_Load(object sender, EventArgs e){//设置Timer控件可⽤this.timer.Enabled = true;//设置时间间隔(毫秒为单位)this.timer.Interval = 1000;}private void timer_Tick(object sender, EventArgs e){currentCount += 1;this.txt_Count.Text = currentCount.ToString().Trim();}private void btn_Start_Click(object sender, EventArgs e) {//开始计时this.timer.Start();}private void btn_Stop_Click(object sender, EventArgs e) {//停⽌计时this.timer.Stop();}}}2、System.Timers.Timer设计界⾯:后台代码:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace TimersTimer{public partial class FrmMain : Form{//定义全局变量public int currentCount = 0;//定义Timer类System.Timers.Timer timer;//定义委托public delegate void SetControlValue(string value);public FrmMain(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e) {InitTimer();}/// <summary>/// 初始化Timer控件/// </summary>private void InitTimer(){//设置定时间隔(毫秒为单位)int interval = 1000;timer = new System.Timers.Timer(interval);//设置执⾏⼀次(false)还是⼀直执⾏(true)timer.AutoReset = true;//设置是否执⾏System.Timers.Timer.Elapsed事件timer.Enabled = true;//绑定Elapsed事件timer.Elapsed += new System.Timers.ElapsedEventHandler(TimerUp);}/// <summary>/// Timer类执⾏定时到点事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void TimerUp(object sender, System.Timers.ElapsedEventArgs e){try{currentCount += 1;this.Invoke(new SetControlValue(SetTextBoxText),currentCount.ToString()); }catch (Exception ex){MessageBox.Show("执⾏定时到点事件失败:" + ex.Message);}}/// <summary>/// 设置⽂本框的值/// </summary>/// <param name="strValue"></param>private void SetTextBoxText(string strValue){this.txt_Count.Text = this.currentCount.ToString().Trim();}private void btn_Start_Click(object sender, EventArgs e){timer.Start();}private void btn_Stop_Click(object sender, EventArgs e){timer.Stop();}}}3、System.Threading.Timer设计界⾯:后台代码:using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Threading;namespace Threading.Timer{public partial class FrmMain : Form{//定义全局变量public int currentCount = 0;//定义Timer类System.Threading.Timer threadTimer;//定义委托public delegate void SetControlValue(object value);public FrmMain(){InitializeComponent();}private void FrmMain_Load(object sender, EventArgs e){InitTimer();}/// <summary>/// 初始化Timer类/// </summary>private void InitTimer(){threadTimer = new System.Threading.Timer(new TimerCallback(TimerUp), null, Timeout.Infinite, 1000);}/// <summary>/// 定时到点执⾏的事件/// </summary>/// <param name="value"></param>private void TimerUp(object value){currentCount += 1;this.Invoke(new SetControlValue(SetTextBoxValue), currentCount);}/// <summary>/// 给⽂本框赋值/// </summary>/// <param name="value"></param>private void SetTextBoxValue(object value){this.txt_Count.Text = value.ToString();}/// <summary>/// 开始/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_Start_Click(object sender, EventArgs e){//⽴即开始计时,时间间隔1000毫秒threadTimer.Change(0, 1000);}/// <summary>/// 停⽌/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_Stop_Click(object sender, EventArgs e){//停⽌计时threadTimer.Change(Timeout.Infinite, 1000);}}}代码下载链接:到此这篇关于C#中的三种定时计时器Timer⽤法的⽂章就介绍到这了。

定时函数的应用综述

定时函数的应用综述

定时函数的应用综述
当我们在衡量一个函数的运行时间,或者是判断一个算法的时间效率,或者在程序中我们需要一个定时器来定时执行一个特定的操作,如闹铃、时钟、多媒体、游戏动画等,都要用到时间函数。

编译器和时间函数为我们提供了很多时间函数,而这些函数的精度和用法也是各不相同的。

下面我们就对几种常见的定时函数进行比较、详述:
小结:以上提到的9种时间函数,由于他们的用处不同,其精度也有很大的差异,用户可以根据不同的需求选择合适的时间函数。

本文原始资料来源于网络,经个人加工形成,有些函数由于没有经过自己的测试,资料不一定准确,在选择了具体的函数之后,使用时尚须查阅该函数具体的资料。

我在程序中使用过的函数举例: 1:Sleep(1000)
//
延时1s ,多用于多线程程序中,如果在单个线程的程序中使用,有类似死机现象。

2、Timer 事件:
该函数使用比较简单,但由于其精度与系统繁忙程度有关,在不需精确定时的场合应用非常好用,但如果需要精确定时,建议不要使用;
(1) 定时 setTimer(1,1000,NULL)//为定时器一设置一个1秒的周期 (2) 在应用程序中添加OnTime() {
CDC * pDC;
pDC->TextOut(100,100,“This is a test!”);
}//消息响应函数,在该函数中处理你想有响应的事件。

3、TimeSetEvent()函数。

MFC 定时器用法

MFC 定时器用法

下面这段代码的主要功能是设置两个时钟定时器,一个间隔是1ms,一个间隔是2s。每执行一次,把当前系统时钟值输入文件“cure.out”中,以比较该定时器的精确度。
//定义1ms和2s时钟间隔,以ms为单位
# define ONE_MILLI_SECOND 1
1、SetTimer定义在那里?
SetTimer表示的是定义个定时器。根据定义指定的窗口,在指定的窗口(CWnd)中实现OnTimer事件,这样,就可以相应事件了。
SetTimer有两个函数。一个是全局的函数::SetTimer()
UINT SetTimer(
Specifies the address of the application-supplied
TimerProc
Байду номын сангаас
callback function that processes the WM_TIMER messages. If this parameter is NULL, the WM_TIMER messages are placed in the application’s message queue and handled by the CWnd object。
uDelay:延迟时间;
uResolution:时间精度,在Windows中缺省值为1ms;
lpFunction:回调函数,为用户自定义函数,定时调用;
dwUser:用户参数;
uFlags:标志参数;
TIME_ONESHOT:执行一次;
#define IDTIMER1 1
#define IDTIMER2 2
(2)在CMainFrame的OnCreate函数中定义两个定时器的属性。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

定时器使用总结:
1、在WM_CREATE消息中启动定时器(SetTimer) 2、在WM_TIMER消息中编写定时函数(即需要周期性完成的工作)
3、在定时工作完成之后关闭/停止定时器。(可选)
返回
4.1
3、程序示例
程序设计目标:设计一个定时器程序,窗口内显示的数字每隔100毫秒 自动加1。
程序设计步骤:
}
返回
4)编写回调函数代码 void CALLBACK CTimerSampleDlg::TimeProc(UINT uID,UINT uMsg,
DWORD dwUser,DWORD dw1,DWORD dw2)
{ m_Cal=m_Cal+1;
}
回调函数参数说明: uID——定时器标识,其值和TimerID一致。 uMsg,dw1,dw2保留参数,目前不起作用 dWUser——存放用户的回调数据。
返回
MMRESULT timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, WORD dwUser, UINT fuEvent )
参数说明:
uDelay:以毫秒指定时的周期 Uresolution:以毫秒指定延时的精度,数值越小定时器事件分辨率越 高。缺省值为1ms。 LpTimeProc:指向一个回调函数,该回调函数包含需要定时执行的代码。 DwUser:存放用户提供的回调数据。 FuEvent:指定定时器事件类型: TIME_ONESHOT:uDelay毫秒后只产生一次事件。
1、WM_TIMER的功能: (1)可以完成定时操作。
(2)定时任务执行完毕后,将控制权交回给程序。程序可以进行其它
的操作。
返回
WM_TIMER方式定时的工作原理
应用程序启动定时器
系统监控到定时时间到
应用程序响应其他 消息或执行其它的 操作
应用程序触发WM_TIMER消息
应用程序响应WM_TIMER消息 (即执行WM_TIMER相应的响应函数)
返回
第3章 定时器的应用
返回
目录

3.1 概述

3.2 定时器的使用方法

3.3 其它定时方法概述
4.1 3.1 概述
在计算机程序设计领域,有很多功能是周期性执行的, 如:数据采集程序,系统时间的显示等。 数据采集:周期性地获得现场的物理量信息
系统时间的显示:周期性地获得系统时间,并显示出来。
完成上述这些功能的代码都是按照一定的时间间隔周期性地执行 的,这是就需要用到一个新的组件——定时器(TIMER)。 定时器是Windows系统的资源, Visual C++提供了定时器消息和一 些与定时相关的函数。使用这些函数可以完成程序代码的周期性执行。
返回
步骤3 添加WM_TIMER的消息响应函数(略)
步骤4 添加定时器消息响应代码。 void CTimerSampleDlg::OnTimer(UINT nIDEvent) {
m_Edit1=m_Edit1+1;
UpdateData(FALSE);//将变量的值送给控件显示。 CDialog::OnTimer(nIDEvent);
且仅供Windows 95及其后续版本使用,其精度与CPU的时钟频率有关,
它们要求计算机从硬件上支持精确定时器。 QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数
的原型如下:
BOOL QueryPerformanceFrequency (LARGE_INTEGER *lpFrequency); BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);
{
……. static void CALLBACK TimeProc(UINT uID,UINT uMsg,
DWORD dwUser,DWORD dw1,DWORD dw2); // 定时器回调函数
int TimerID; // 定时器ID …….
};
注意:使用多媒体定时器必须指明回调函数。
返回
3)在OnButtonstarttimer添加启动多媒体定时器的语句
1、生成应用程序框架(基于对话框TimerSample)。 2、编辑对话框资源。
3、添加定时器消息响应函数。
4、添加定时器消息响应代码。 5、增加启动和停止定时器的按钮消息响应函数。
返回
4.1
步骤1 生成应用程序框架 选择基于对话框的程序,名称为TimerSample。 步骤2:编辑对话框资源。在对话框上增加一个编辑框和两个按钮, 控件属性如下: Caption ---------启动定时器 停止定时器 ID IDC_EDIT1 IDC_BUTTONSTARTTIMER IDC_BUTTONKILLTIMER 关联变量 m_Edit1
void CTimerSampleDlg::OnButtonstarttimer() { TimerID = timeSetEvent(100, 1, LPTIMECALLBACK)TimeProc, 0,TIME_PERIODIC); //新加代码
SetTimer(1,100,NULL);/IMER的缺点:
1、精度低,最小计时精度大约为55ms(Win95),或10ms左右(Win2000/xp) 2、定时器消息在多任务操作系统中的优先级较低,有时不能得到及 时响应。(一旦计算机的CPU被某个进程占用,或系统资源紧张时, 发送到消息队列中的消息就暂时被挂起,WM_TIMER消息得不到及时处 理。)
功能:设置并启动一个多媒体定时器。
函数原型: MMRESULT timeSetEvent( UINT uDelay, UINT uResolution,
LPTIMECALLBACK lpTimeProc, WORD dwUser, UINT fuEvent )
函数头文件:#include "mmsystem.h"
返回
3.2 定时器的使用方法
3.2.1 Sleep函数
3.2.2 WM_TIMER消息 3.2.3 多媒体定时器
返回
Viusal C++提供了三种完成周期性操作的方法: 1、Sleep函数(延时函数)。 2、WM_TIMER消息(Windows窗口消息)。 3、多媒体定时器。
返回
3.2.1 Sleep函数 while(1) {
}
返回
步骤5、增加启动和停止定时器的消息响应函数。 void CTimerSampleDlg::OnButtonkilltimer() {
KillTimer(1);
} void CTimerSampleDlg::OnButtonstarttimer() {
SetTimer(1,100,NULL);
返回
3.2.3 多媒体定时器 1、 针对前两种定时器的缺点,MicroSoft公司提供了一种精度更高的 定时器——多媒体定时器。 优点: (1)精度较高:多媒体定时器最小误差为1毫秒。 (2)优先级较高,可以减轻资源紧张对定时器运行的影响。
返回
2、多媒体定时器的使用
timeSetEvent 函数
返回
4.1
3、使用QueryPerformanceFrequency()和QueryPerformanceCounter
()函数
对于更精确的定时操作,使用QueryPerformanceFrequency()和 QueryPerformanceCounter()函数。这两个函数是Visual C++提供并
TIME_PERIODIC :每隔uDelay毫秒周期性地产生事件。
返回
2、使用举例 程序功能:实现窗口内数字每隔100毫秒自动加1。 1)在TimerSample程序的主窗口上增加一个编辑控件
返回
2)在对话框的头文件中定义代码
class CTimerSampleDlg : public CDialog
5)在OnTimer中增加代码显示Cal的值。 void CTimerSampleDlg::OnTimer(UINT nIDEvent)
{
m_Edit1=m_Edit1+1; m_Edit2=m_Cal;//添加的代码
UpdateData(FALSE);
CDialog::OnTimer(nIDEvent); }
返回
2、使用WM_TIMER消息需要用到的函数 1) SetTimer()
功能:设置定时间隔并启动定时器。
函数原型:UINT SetTimer(UINT nIDEvent,UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD)); 参数说明: nIDEvent:非0值标识Timer的id 。 nElapse:以毫秒为单位的定时间隔时间 lpfnTimer 指向定时事件到达时调用的函数的指针,如果为NULL,那么 调用OnTimer() 例:SetTimer(1,200,NULL)设置并启动一个时间间隔为200ms的定时器。
i=i+1; //此处添加需要周期性执行的代码。
Sleep(1000); } Sleep函数:延时函数 参数:延时的时间(单位ms)
返回
Sleep函数分析 优点: (1)使用简单。 (2)移植方便。
缺点:
(1)CPU占用率高,一般适用于单任务的程序(如DOS操作系统的程序)
(2)程序能够完成的功能比较简单。 (3)定时精度低,(据资料)最小误差为54.915 ms,每秒18.2次。
返回
程序运行结果
4.1
返回
相关文档
最新文档