Windows编程中高精度定时的实现
亲测利用windows 10任务计划实现计算机定时开关机(休眠唤醒)
利用任务计划实现计算机定时开关机(休眠唤醒)计算机如果具有定时开关机功能,是一件很吸引人的事情。
但是一般的电脑要实现开关机功能,需要有硬件的支持。
所幸的是,在没有硬件支持的情况下,我们可以利用windows 系统自带的任务计划程序和电脑的休眠功能,实现计算的定时开关机。
下面以windows 10为例进行介绍。
工具/原料•电脑•windows 10操作系统方法/步骤1.首先查看电脑的休眠功能是否开启,如果没有需要先开启计算机的休眠功能(注意是“休眠”而不是“睡眠”)。
比较直接的方法是,点击系统“开始”,在搜索窗口中输入“cmd.exe”,在结果中看见了“cmd.exe”,右击选择“以管理员权限运行程序”打开“cmd.exe”命令窗口,输入命令“powercfg -h on”即可开启计算机休眠功能。
注:如何关闭休眠功能?—开始菜单-所有程序-附件-右键命令提示符-使用管理员权限打开—输入“powercfg -h off”回车。
补充重点:必须取消选择“自动重新启动”——解决休眠重启问题步骤:首先右击开始菜单,再点击系统,打开系统属性,再打开左侧的高级系统设置那栏,点击“启动和故障恢复”的“设置”,然后取消选择“自动重新启动”选项。
看下图:2.进入windows“控制面板”,右上角选择查看方式为“小图标”,选择下面的“电源选项”。
在弹出的窗口中,点击左侧“更改计算机睡眠时间”,进入新的窗口点击下面的“更改高级电源设置”,弹出点源高级设置窗口。
点击节点“睡眠”,将“允许混合睡眠关闭”,将“允许使用唤醒定时器”开启。
补充说明:睡眠模式下的“混合睡眠”——如果不断电,系统将从内存恢复;如果断电,将从硬盘恢复,所以不用担心数据会丢失。
所以开启也不影响休眠唤醒功能。
“唤醒时需要密码”——根据自己需要开启——即锁屏开启不需要密码即可进入桌面。
3.下面建立定时休眠的任务计划。
右击计算机,选择“管理”。
弹出的窗口左侧选择“系统工具”-->"任务计划程序"-->"任务计划程序库"可以看见所有的任务计划程序。
使用CPU时间戳进行高精度计时
使用CPU时间戳进行高精度计时对关注性能的程序开发人员而言,一个好的计时部件既是益友,也是良师。
计时器既可以作为程序组件帮助程序员精确的控制程序进程,又是一件有力的调试武器,在有经验的程序员手里可以尽快的确定程序的性能瓶颈,或者对不同的算法作出有说服力的性能比较。
在Windows平台下,常用的计时器有两种,一种是timeGetTime多媒体计时器,它可以提供毫秒级的计时。
但这个精度对很多应用场合而言还是太粗糙了。
另一种是QueryPerformanceCount计数器,随系统的不同可以提供微秒级的计数。
对于实时图形处理、多媒体数据流处理、或者实时系统构造的程序员,善用QueryPerformanceCount/QueryPerformanceFrequency是一项基本功。
本文要介绍的,是另一种直接利用Pentium CPU内部时间戳进行计时的高精度计时手段。
以下讨论主要得益于《Windows图形编程》一书,第15页-17页,有兴趣的读者可以直接参考该书。
关于RDTSC指令的详细讨论,可以参考Intel产品手册。
本文仅仅作抛砖之用。
在Intel Pentium以上级别的CPU中,有一个称为“时间戳(Time Stamp)”的部件,它以64位无符号整型数的格式,记录了自CPU上电以来所经过的时钟周期数。
由于目前的CPU主频都非常高,因此这个部件可以达到纳秒级的计时精度。
这个精确性是上述两种方法所无法比拟的。
在Pentium以上的CPU中,提供了一条机器指令RDTSC(Read Time Stamp Counter)来读取这个时间戳的数字,并将其保存在EDX:EAX寄存器对中。
由于EDX:EAX寄存器对恰好是Win32平台下C++语言保存函数返回值的寄存器,所以我们可以把这条指令看成是一个普通的函数调用。
像这样:inline unsigned __int64 GetCycleCount(){__asm RDTSC}但是不行,因为RDTSC不被C++的内嵌汇编器直接支持,所以我们要用_emit伪指令直接嵌入该指令的机器码形式0X0F、0X31,如下:inline unsigned __int64 GetCycleCount(){__asm _emit 0x0F__asm _emit 0x31}以后在需要计数器的场合,可以像使用普通的Win32 API一样,调用两次GetCycleCount函数,比较两个返回值的差,像这样:unsigned long t;t = (unsigned long)GetCycleCount();//Do Something time-intensive ...t -= (unsigned long)GetCycleCount();《Windows图形编程》第15页编写了一个类,把这个计数器封装起来。
timebeginperiod_原理_解释说明以及概述
timebeginperiod 原理解释说明以及概述1. 引言1.1 概述本文将深入探讨Windows系统编程中的一个重要函数timeBeginPeriod的原理、使用方法以及效果。
timeBeginPeriod是一个用于调整系统定时器精度的函数,它可以影响到程序的时间控制和性能表现。
了解并正确使用timeBeginPeriod函数对于需要进行实时或高精度时间控制的应用程序开发至关重要。
1.2 文章结构本文共分为五个部分。
首先,在引言部分我们将介绍文章概述、结构和目的,确立了整篇文章的框架和主题。
接下来,第二部分将详细介绍timeBeginPeriod 函数的原理,包括其基本介绍、功能以及实现原理。
第三部分将解释说明timeBeginPeriod函数的使用方法和产生的效果,包括调用方式、与系统定时器关系以及更精准时间控制带来的效果解释。
第四部分会探讨在不同操作系统中使用timeBeginPeriod函数可能存在的差异和注意事项,比较各操作系统对其支持情况,并讨论在多任务操作系统中使用该函数所需考虑的问题。
最后,在第五部分中,我们将总结和归纳timeBeginPeriod函数的原理及应用,并展望其未来发展可能性和趋势,提出进一步研究的方向和问题。
1.3 目的本文的目的是通过对timeBeginPeriod函数进行深入分析和解释,使读者能够全面了解其原理、使用方法以及在不同操作系统中可能存在的差异和注意事项。
同时,我们希望为读者提供有关如何实现更精准时间控制的指导,并展示timeBeginPeriod函数在实际应用中所具备的潜力与价值。
通过阅读本文,读者将能够更加理解并灵活运用timeBeginPeriod函数,从而为他们自己的程序设计、开发和优化工作提供有益参考。
2. timebeginperiod原理:2.1 timeBeginPeriod函数介绍:timeBeginPeriod函数是一个Windows API函数,它用于提高系统时钟的精度。
定时作业实例实验报告
实验名称:定时作业实例一、实验目的1. 了解定时作业的概念和作用;2. 掌握定时作业的实现方法;3. 通过实例验证定时作业的执行效果。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.73. 软件环境:PyCharm三、实验内容1. 定时作业的概念和作用定时作业是指根据设定的时间自动执行的任务。
它可以用于自动化处理一些重复性工作,提高工作效率。
2. 定时作业的实现方法Python中可以使用第三方库`schedule`来实现定时作业。
以下是`schedule`库的基本使用方法:(1)导入`schedule`库```pythonimport scheduleimport time```(2)定义定时任务```pythondef job():print("定时任务执行")```(3)添加定时任务```pythonschedule.every().day.at("10:00").do(job)```(4)运行定时任务```pythonwhile True:schedule.run_pending()time.sleep(1)```3. 实例验证(1)编写一个简单的Python脚本,实现每天定时发送邮件提醒功能。
```pythonimport smtplibfrom email.mime.text import MIMETextfrom email.header import Headerdef send_email():sender='**********************'receivers=['*********************','*********************'] message = MIMEText('这是邮件内容', 'plain', 'utf-8')message['From'] = Header("发件人", 'utf-8')message['To'] = Header("收件人", 'utf-8')message['Subject'] = Header('定时发送的邮件', 'utf-8')try:smtp_obj = smtplib.SMTP('', 587)smtp_obj.starttls()smtp_obj.login(sender, 'password')smtp_obj.sendmail(sender, receivers, message.as_string())print("邮件发送成功")except smtplib.SMTPException as e:print("邮件发送失败", e)# 添加定时任务schedule.every().day.at("10:00").do(send_email)# 运行定时任务while True:schedule.run_pending()time.sleep(1)```(2)在PyCharm中运行上述脚本,观察是否能够成功发送邮件。
运用Windows定时器队列实现高精度定时
运用Windows定时器队列实现高精度定时0 引言在软件开发过程中,定时器是一种常用的设计元素。
Windows 平台上的定时器编程有多种实现方式,比较常用的有:SetTimer()实现的定时器、timeSetEvent()函数实现的多媒体定时器、可等待定时器(Waitable timer)、相关的Windows API函数结合循环采用轮询机制实现的定时功能,以及定时器队列定时器(Timer-queue timer)等。
SetTimer()函数可以为Windows 程序分配一个定时器,该定时器利用WM_TIMER 消息映射来进行简单的时间控制,定时精度约为55ms.由于Windows系统采用多线程的抢占式多任务工作方式,而WM_TIMER消息优先级较低,因此这种定时方法适用于对定时精度要求不高的情况。
Delphi、VB等快速原型化开发工具中自带的定时器控件,基本上都是采用该方法实现的。
除了定时精度低以外,VB的定时器控件有更大的缺陷,其定时间隔不能超过65535ms,更限制了这样的定时器控件的应用。
与SetTimer()函数实现的定时器相比,timeSetEvent()实现的多媒体定时器,可以实现多分辨率的定时,分辨率越高,定时精度越高,但系统所需的开销越重。
该函数可以实现只进行一次性的定时事件出发,也可以进行常规的周期性定时,因此该方法的应用比较灵活,但出于种种原因,微软在MSDN中明确指出,该函数已被摒弃,在应用程序开发过程中不应再使用该方法进行定时。
Windows 中很多与时间相关的API 函数可以与循环结合,采用轮询机制实现定时功能。
典型的API函数有GetTickCount()、timeGetTime()、QueryPerformanceFrequency ()和QueryPerformanceCounter()。
GetTickCount()和timeGetTime()都是获取自系统启动以来流逝的秒数,结合循环,获取两次调用之间的差值即可实现定时。
Windows cmd命令中的定时任务设置技巧
Windows cmd命令中的定时任务设置技巧在日常的计算机使用中,我们经常需要定时执行一些任务,比如备份文件、清理临时文件等等。
而Windows系统提供了一种方便的工具——cmd命令,可以帮助我们实现定时任务的设置。
本文将介绍一些Windows cmd命令中的定时任务设置技巧,帮助读者更好地利用这一工具。
一、使用schtasks命令设置定时任务schtasks是Windows系统中用于设置定时任务的命令。
通过它,我们可以方便地设置任务的执行时间、频率以及相关参数。
以下是一些常用的schtasks命令及其用法:1. 创建定时任务:schtasks /create /tn 任务名称 /tr 任务路径 /sc 执行频率 /st 开始时间其中,“任务名称”是自定义的任务名,“任务路径”是要执行的任务的路径,“执行频率”可以是一次性、每天、每周等等,“开始时间”是任务的开始执行时间。
例如,我们可以使用以下命令创建一个每天执行的备份任务:schtasks /create /tn "每日备份" /tr "C:\backup.bat" /sc daily /st 08:002. 查看定时任务:schtasks /query /tn 任务名称通过该命令,我们可以查看指定任务的详细信息,包括任务的路径、执行时间、状态等等。
例如,我们可以使用以下命令查看刚刚创建的备份任务:schtasks /query /tn "每日备份"3. 删除定时任务:schtasks /delete /tn 任务名称 /f通过该命令,我们可以删除指定的定时任务。
需要注意的是,使用/f参数可以强制删除任务,而不需要确认。
例如,我们可以使用以下命令删除备份任务:schtasks /delete /tn "每日备份" /f二、使用timeout命令延时执行任务除了使用schtasks命令设置定时任务外,我们还可以使用timeout命令实现任务的延时执行。
Windows cmd 中的定时任务和计划任务配置技巧
Windows cmd 中的定时任务和计划任务配置技巧在日常使用 Windows 操作系统时,我们经常需要定期执行一些任务,如备份文件、清理临时文件、更新软件等。
为了提高工作效率,Windows 提供了定时任务和计划任务的功能,可以自动执行这些任务,而无需手动操作。
本文将介绍Windows cmd 中的定时任务和计划任务配置技巧,帮助您更好地利用这些功能。
一、定时任务的基本概念和使用方法定时任务是指在指定的时间点或时间间隔内自动执行某项任务。
在 Windows cmd 中,我们可以使用 "schtasks" 命令来创建和管理定时任务。
下面是一些常用的定时任务配置技巧:1. 创建定时任务:使用 "schtasks /create" 命令可以创建一个新的定时任务。
例如,要创建一个每天凌晨 3 点执行的备份任务,可以使用以下命令:```schtasks /create /tn "Backup Task" /tr "C:\backup.bat" /sc daily /st 03:00```其中 "/tn" 参数指定任务名称,"/tr" 参数指定要执行的任务(可以是一个批处理文件或可执行文件),"/sc" 参数指定任务的触发频率,"/st" 参数指定任务的开始时间。
2. 修改定时任务:使用 "schtasks /change" 命令可以修改已经存在的定时任务。
例如,要修改刚才创建的备份任务的执行时间为每周一至周五的凌晨 3 点,可以使用以下命令:```schtasks /change /tn "Backup Task" /tr "C:\backup.bat" /sc weekly /dMON,TUE,WED,THU,FRI /st 03:00```其中 "/d" 参数指定任务的执行日期。
windows服务中的定时器timer使用
windows服务中的定时器timer使⽤⼤家在使⽤c#写windows服务时,⽹上很多例⼦说,使⽤⼯具箱中组件中的定时器就可以,但实际上该定时器并不管⽤,具体原因,微软⾃称是Framework的bug。
⽆论是windows窗体中timer还是组件中的timer都是继承⾃System.Windows.Form.Timer,并不是我们需要的System.Timers ,继承⾃System.Timers 的timer只有⼿动创建。
public WindowsServiceDemo(){InitializeComponent();System.Timers.Timer t = new System.Timers.Timer(1000);//实例化Timer类,设置间隔时间为10000毫秒;t.Elapsed += new System.Timers.ElapsedEventHandler(TimeElapse);//到达时间的时候执⾏事件;t.AutoReset = true;//设置是执⾏⼀次(false)还是⼀直执⾏(true);t.Enabled = true;//是否执⾏System.Timers.Timer.Elapsed事件;}public void TimeElapse(object source, System.Timers.ElapsedEventArgs e){//EventLog log = new EventLog();//log.Source = "我的应⽤程序";//log.WriteEntry("1秒调⽤⼀次", rmation);FileStream fs = new FileStream(@"d:\timetick.txt", FileMode.OpenOrCreate, FileAccess.Write);StreamWriter m_streamWriter = new StreamWriter(fs);m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);m_streamWriter.WriteLine("过了⼀秒 " + DateTime.Now.ToString() + "\n");m_streamWriter.Flush();m_streamWriter.Close();fs.Close();}。
在Windows CMD中编写和执行定时任务
在Windows CMD中编写和执行定时任务Windows CMD(命令提示符)是Windows操作系统中的一个强大工具,它可以用于执行各种系统命令和脚本。
其中一个非常有用的功能是编写和执行定时任务,这可以帮助我们在特定的时间自动运行一些任务,从而提高工作效率和便利性。
一、了解Windows CMD的基本命令在开始探索如何编写和执行定时任务之前,我们首先需要了解一些Windows CMD的基本命令。
打开CMD窗口后,我们可以使用"dir"命令查看当前目录的文件和文件夹,使用"cd"命令切换目录,使用"mkdir"命令创建新的文件夹,使用"copy"命令复制文件等等。
这些基本命令对于后续编写和执行定时任务非常重要。
二、编写定时任务的脚本在Windows CMD中,我们可以使用批处理脚本(以.bat为扩展名)来编写定时任务。
打开记事本或其他文本编辑器,编写一个批处理脚本,其中包含我们要在特定时间运行的命令或脚本。
例如,我们可以编写一个批处理脚本来备份某个文件夹,命令如下:```@echo offecho 正在备份文件夹...xcopy "C:\Users\Username\Documents" "D:\Backup" /e /i /h /yecho 备份完成!```在这个例子中,我们使用了"xcopy"命令来复制源文件夹中的所有文件和子文件夹到目标文件夹中。
通过编写类似的脚本,我们可以实现各种不同的定时任务。
三、使用计划任务来执行定时任务Windows操作系统提供了一个内置的工具叫做"计划任务",它可以帮助我们设置和执行定时任务。
打开CMD窗口,输入"taskschd.msc"命令打开计划任务管理器。
在左侧的面板中,我们可以看到计划任务的各种设置选项。
通过Windows CMD实现定时任务和计划执行
通过Windows CMD实现定时任务和计划执行在日常工作和生活中,我们经常需要执行一些定时任务,比如备份文件、清理临时文件、定时关机等。
Windows CMD(命令提示符)是Windows操作系统的一个强大工具,可以通过它来实现定时任务和计划执行。
本文将介绍如何使用Windows CMD来实现这些功能。
一、定时任务的创建和管理1. 打开命令提示符窗口:按下Win+R组合键,输入“cmd”并回车,即可打开命令提示符窗口。
2. 创建定时任务:在命令提示符窗口中输入“schtasks /create /sc <schedule> /tn<taskname> /tr <command>”,其中<schedule>表示定时任务的触发频率,可以是一次性、每天、每周、每月等;<taskname>表示定时任务的名称;<command>表示定时任务要执行的命令或脚本。
例如,要创建一个每天凌晨3点执行的备份文件的定时任务,可以输入以下命令:schtasks /create /sc daily /tn "BackupTask" /tr "xcopy C:\source\* D:\backup\ /s /e/y"3. 查看定时任务:在命令提示符窗口中输入“schtasks /query”,即可查看当前系统中的所有定时任务。
4. 删除定时任务:在命令提示符窗口中输入“schtasks /delete /tn <taskname> /f”,其中<taskname>表示要删除的定时任务的名称。
二、计划执行的实现方法除了定时任务,Windows CMD还可以实现计划执行的功能。
计划执行是指在特定条件下自动执行某些操作,比如系统启动时自动运行某个程序。
1. 打开命令提示符窗口:同上述步骤。
2. 创建计划执行:在命令提示符窗口中输入“reg addHKLM\Software\Microsoft\Windows\CurrentVersion\Run /v <name> /t REG_SZ /d<command> /f”,其中<name>表示计划执行的名称,可以是任意名称;<command>表示计划执行要运行的命令或程序。
在Windows CMD中创建定时任务的方法
在Windows CMD中创建定时任务的方法Windows操作系统是目前使用最广泛的操作系统之一,而CMD(命令提示符)则是Windows系统中常用的命令行工具。
在CMD中,我们可以使用定时任务来自动执行一些重复性的操作,比如定时备份文件、定时清理垃圾文件等。
下面将介绍在Windows CMD中创建定时任务的方法。
一、打开CMD命令提示符要创建定时任务,首先需要打开CMD命令提示符。
可以通过以下两种方式打开CMD:1. 使用快捷键:按下Win键+R键,在弹出的运行窗口中输入"cmd",然后按下回车键即可打开CMD。
2. 使用开始菜单:点击Windows开始菜单,选择“所有程序”或“程序”,找到“附件”文件夹,再点击“命令提示符”即可打开CMD。
二、查看已有的定时任务在CMD中,我们可以使用“schtasks”命令来查看已有的定时任务。
输入以下命令并按下回车键:schtasks /query系统会列出所有已创建的定时任务的详细信息,包括任务名称、下次运行时间、状态等。
三、创建定时任务在CMD中,我们可以使用“schtasks”命令来创建定时任务。
输入以下命令并按下回车键:schtasks /create /sc <schedule> /tn <taskname> /tr <command> /st <starttime>其中,<schedule>表示定时任务的执行频率,可以是一次性、每天、每周、每月等。
例如,如果想创建一个每天执行的定时任务,可以将<schedule>替换为"daily"。
<taskname>表示定时任务的名称,可以根据实际需求自定义。
<command>表示要执行的命令或脚本的路径。
例如,如果要执行一个名为"backup.bat"的批处理文件,可以将<command>替换为"\"C:\path\to\backup.bat\"。
基于APIC的高精度定时器设计
基于APIC的高精度定时器设计杨皓;江南;杜承烈【摘要】Timer with a certain precision is often required in the process of developing the system. In the Windows real time extending process,aiming at the problem of insufficient original timing accuracy and the fluctuation problem,this paper presents a high precision timer based on local Advanced Programmable Interrupt Controller( APIC) . Making use of the counting register programs CPU sheet structure of APIC,it constructs high precision clock effectively,and uses the kernel driver construction scheduling management,memory mapping to improve data transmission speed of user state to guarantee real-time kernel to provide real-time. DLL provides a set of interface for users. Experimental results show that the scheme can effectively solve the problem of timing precision,and it has good usability.%在操作系统开发过程中需要一定精度的计时器支持。
使用Windows CMD命令执行定时任务的实用方法
使用Windows CMD命令执行定时任务的实用方法在日常工作和生活中,我们经常需要执行一些定时任务,例如定时备份文件、定时清理系统垃圾等。
而Windows操作系统提供了CMD命令行工具,可以通过编写命令脚本来实现定时任务的自动执行。
本文将介绍一些实用的方法,帮助读者更好地利用Windows CMD命令执行定时任务。
一、了解CMD命令行工具CMD(Command Prompt)是Windows操作系统中的命令行工具,通过CMD 可以执行各种系统命令和应用程序。
CMD提供了一系列命令来操作文件、目录、网络、进程等,非常适合用于编写定时任务脚本。
二、创建定时任务脚本在Windows系统中,我们可以使用记事本或其他文本编辑器来创建定时任务脚本。
脚本文件的扩展名通常为.bat或.cmd。
下面是一个简单的定时备份文件的脚本示例:```@echo offecho 正在执行文件备份...xcopy /s /e /y "C:\source" "D:\backup"echo 备份完成!```在这个脚本中,我们使用了echo命令来输出一些提示信息,然后使用xcopy 命令来实现文件的备份。
其中,/s表示复制目录及其子目录,/e表示复制目录及其子目录,包括空目录,/y表示覆盖目标文件。
三、使用Task Scheduler创建定时任务Windows系统提供了Task Scheduler(任务计划程序)工具,可以帮助我们创建和管理定时任务。
通过Task Scheduler,我们可以设置任务的执行时间、频率和执行条件等。
下面是创建定时任务的步骤:1. 打开控制面板,并选择“管理工具”下的“任务计划程序”。
2. 在任务计划程序窗口中,选择“创建基本任务”。
3. 在任务创建向导中,按照提示设置任务的名称、描述、触发器和操作等。
4. 在操作设置中,选择“启动程序”,并指定要执行的脚本文件路径。
利用Windows定时器队列开发高精度定时器控件
带 的定 时器 控件 的限制, 克服了一些 Wi n d o wsቤተ መጻሕፍቲ ባይዱA P I 函数实现 的传统 的定时方法 的缺 陷, 可 以实 现定时间隔最长为 2 1 4 7 4 8 3 6 4 7 毫秒( 约为 2 4 . 8 5 5 天) 的精确定时, 为工业控制 、 数 据采集等应用软件 的开发提供 了极 大的方 便。 关键词 :定时器; 定 时器 队列 ; Ac t i v e X控件
器 、可等 待定 时器 ( Wa i t a b l e t i m e r ) 、相 关 的 Wi n d o w s A P I
函数结合循环采用轮询机制实现 的定 时功 能 ,以及 定时器队列
定时器 ( T i me r - q u e u e t i me r )等。 S e t T i me r 0 i  ̄数可 以为 Wi n d o w s 程序分配一个定 时器 ,该定 时器 利用 WM_ T I ME R消息 映射来进行 简单 的时 间控 制 ,定 时
删
s : T i me r ; T i me r q u e u e ; Ac t i v e X c o n t r o l
中图分类号 :T P 3 1 1
文献标识码 :B
文章编号 :1 0 0 1 — 9 2 2 7( 2 0 1 5 )0 3 - 0 0 5 7 — 0 3
D Ol 编码 :1 0 . 1 4 0 1 6 / j . c n k i . 1 0 0 1 . 9 2 2 7 . 2 0 1 5 . 0 3 . 0 5 7
Ab s I r a c t : A n u mb e r o f me t h o d s c a n b e u s e d t o d e v e l o p s o f t wa r e t i me r i n Wi n d o ws .S o me o f t h e m a r e a n a l y z e d i n t h i s p a p e r ,
Windows编程环境下高精度计时技术的分析比较
高精度就是保证游戏仿真结果的逼真性 ; 高可靠 性 就是 保证 游戏 系统 的每 一项 工作 都 能在预 定 的
时间 内得 到可靠 执行 , 防止 “ 失帧 ” .
收稿 日期 :20 0 6—1 — 8 1 2
件有力 的调试武器 , 有经验的程序员借此可 以 很快 地确 定 程序 的性 能 瓶 颈 , 或者 对 不 同 的算 法
Ab tac s r t:
S v rl i ・e h oo is n e e a tme tc n lge i W i d ws n o Pr g a o r m a e n r d c d, a d he e i ・ r i to u e n t s t me
tc n lg e I ay e d c mpae y s me e pe me t. e h o o i s a1 a l z d a o en n rd b o x r i ns Ke r s: y wo d Ti r Co to ;Vit a v c iv r;Mu tme i —i r me n r l ru l De ie Dr e l i d a tme ;CPU me S a Ti t mp; Hih s
多优 越性 能 ,目前 已成 为事 实 上 的标 准 桌 面通 用
操作系统. no s Wi w 操作系统不仅被普通用户使 d 用, 而且 越来 越广 泛地 应 用 于 工业 控 制 领域 … .
同样 在基 于 Widw 系 统 的游 戏 编程 中 , 对 实 no s 也 时性 有 了很 高 的要 求 , 其 是 许 多 大 型 网络 游 戏 尤 的定 时 器必须 满 足 高 精 度 和 高 可靠 性两 个 条 件 .
2 Sho o Meh n a E gne n . col f c i l n e r g& A tm t n S n h i nvrt, h nh i 20 7 C i ) a c i i uo ai , h g i sy S g a 0 02, n o a a U ei a h a
Windows实现python程序定时启动
Windows实现python程序定时启动步骤1: 保存Python脚本确保你的Python脚本(例如auto_login.py)已经准备好并且能够在本地环境中成功运行。
步骤2: 打开任务计划程序按下Windows键,输入“任务计划程序”,然后选择打开它。
步骤3: 创建基本任务在任务计划程序的右侧栏中,点击“创建基本任务...”来启动向导。
步骤4: 输入任务信息在“名称”字段中输入一个描述性的名称,如AutoLoginScript。
可选地,你也可以为任务添加描述。
点击“下一步”。
步骤5: 选择触发器选择“每天”,然后点击“下一步”。
设置开始时间为11:00 AM,并确认日期是当前或未来的日期。
点击“下一步”。
步骤6: 设置操作选择“启动程序”,然后点击“下一步”。
在“程序或脚本”框中,输入你的Python解释器的完整路径。
这通常是C:\Python39\python.exe或类似的路径,取决于你的Python版本和安装路径。
在“添加参数(可选)”框中,输入你的脚本名称和路径,如C:\path\to\auto_login.py。
如果需要,你还可以设置“起始于 (可选)”字段为你的脚本所在的目录,这样Python解释器就会在该目录下运行你的脚本。
点击“下一步”。
步骤7: 完成任务创建检查你的设置,然后点击“完成”按钮。
步骤8: 确认任务计划在任务计划程序的中央窗格中,你应该能看到你刚创建的任务。
你可以右键点击它,选择“运行”来测试任务是否能成功执行你的脚本。
确保在任务的“属性”中设置了正确的权限,特别是如果你需要任务以管理员权限运行。
通过遵循这些步骤,你可以确保你的Python脚本将每天上午11:00自动运行,从而无需手动干预。
确保测试任务至少一次,以验证一切按预期工作。
Windows下的精确定时器
Windows下的精确定时器在日常的程序开发工作中,有时会遇到许多需要定时完成的操作,如定时显示当前时间,定时刷新屏幕上的进度条等等。
特别是在对控制性能要求较高的实时控制系统和数据采集系统中,就更需要精确定时操作。
众所周知,Windows 是基于消息机制的系统,任何事件的执行都是通过发送和接收消息来完成的。
这样就带来了一些问题,如一旦计算机的CPU被某个进程占用,或系统资源紧张时,发送到消息队列中的消息就暂时被挂起,得不到实时处理。
因此,不能简单地通过Windows消息引发一个对定时要求严格的事件。
另外,由于在Windows中已经封装了计算机底层硬件的访问,所以,要想通过直接利用访问硬件来完成精确定时,也比较困难。
所以在实际应用时,应针对具体定时精度的要求,采取相适应的定时方法。
VC中提供了很多关于时间操作的函数,利用它们控制程序能够精确地完成定时和计时操作。
方式一:VC中的WM_TIMER消息映射能进行简单的时间控制。
这种定时方法非常简单,可以实现一定的定时功能,但其定时功能如同Sleep()函数的延时功能一样,精度非常低,最小计时精度仅为30ms,CPU占用低,且定时器消息在多任务操作系统中的优先级很低,不能得到及时响应,往往不能满足实时控制环境下的应用。
只可以用来实现诸如位图的动态显示等对定时精度要求不高的情况。
方式二:VC中使用sleep()函数实现延时,它的单位是ms,如延时2秒,用sleep(2000)。
精度非常低,最小计时精度仅为30ms,用sleep函数的不利处在于延时期间不能处理其他的消息,如果时间太长,就好象死机一样,CPU占用率非常高,只能用于要求不高的延时程序中。
方式三:利用COleDateTime类和COleDateTimeSpan类结合WINDOWS的消息处理过程来实现秒级延时。
以下是实现2秒的延时代码:ColeDateTime start_time = COleDateTime::GetCurrentTime();COleDateTimeSpan end_time = COleDateTime::GetCurrentTime()-start_time;while( end_time.GetTotalSeconds() < 2 ) // 实现延时2秒{MSG msg;GetMessage(&msg,NULL,0,0);TranslateMessage(&msg);DispatchMessage(&msg);//以上四行是实现在延时或定时期间能处理其他的消息,//虽然这样可以降低CPU的占有率,//但降低了延时或定时精度,实际应用中可以去掉。
Windows CMD命令中的定时任务与计划技巧
Windows CMD命令中的定时任务与计划技巧在Windows操作系统中,CMD命令是一种非常强大的工具,它可以帮助我们完成各种任务。
其中,定时任务与计划技巧是CMD命令的一个重要应用领域。
通过合理利用定时任务与计划技巧,我们可以实现自动化操作,提高工作效率。
本文将介绍一些常用的CMD命令定时任务与计划技巧,帮助读者更好地利用Windows 操作系统。
一、定时任务的基本概念定时任务是指在特定的时间点或时间间隔内自动执行某个操作或程序。
在Windows CMD命令中,我们可以通过使用"SchTasks"命令来创建、修改和删除定时任务。
例如,我们可以使用以下命令创建一个每天早上8点执行的定时任务:SchTasks /Create /SC DAILY /TN "MyTask" /TR "C:\ProgramFiles\MyProgram.exe" /ST 08:00上述命令中,/SC参数指定了定时任务的频率,/TN参数指定了任务的名称,/TR参数指定了要执行的程序的路径,/ST参数指定了任务的开始时间。
二、定时任务的高级应用除了基本的定时任务,CMD命令还提供了一些高级的应用技巧,可以更加灵活地控制任务的执行。
以下是一些常用的高级技巧:1. 条件触发:我们可以通过在定时任务中添加条件,实现任务的触发。
例如,我们可以设置任务在特定的网络连接状态下才执行,或者只有在特定的文件存在时才执行。
2. 任务链:我们可以将多个任务链接在一起,实现任务的连续执行。
例如,我们可以在一个任务执行完毕后,自动启动下一个任务。
3. 任务优先级:我们可以通过设置任务的优先级,控制任务的执行顺序。
例如,我们可以将紧急任务的优先级设置为高,确保其在其他任务之前执行。
4. 任务日志:我们可以通过设置任务的日志功能,记录任务的执行情况。
这对于故障排查和性能分析非常有帮助。
三、计划技巧的应用除了定时任务,CMD命令还提供了一些计划技巧,可以帮助我们更好地管理任务和资源。
Windows CMD命令行中的任务调度和定时执行技巧
Windows CMD命令行中的任务调度和定时执行技巧在Windows操作系统中,命令提示符(CMD)是一种强大的工具,它可以通过命令行执行各种任务。
在CMD中,任务调度和定时执行是一项非常有用的功能,它可以帮助用户自动执行一系列命令,提高工作效率。
本文将介绍一些Windows CMD命令行中的任务调度和定时执行技巧。
一、任务调度任务调度是指在指定的时间或条件下执行特定的任务。
在Windows CMD中,可以使用“schtasks”命令来创建和管理任务调度。
以下是一些常用的任务调度技巧:1. 创建任务调度要创建一个任务调度,可以使用以下命令:```schtasks /create /tn TaskName /tr "Command" /sc ScheduleType /st StartTime /sd StartDate /ed EndDate /ru RunAsUser /rp Password```其中,“TaskName”是任务的名称,“Command”是要执行的命令,“ScheduleType”是调度类型(例如,每天、每周、每月等),“StartTime”是任务的开始时间,“StartDate”是任务的开始日期,“EndDate”是任务的结束日期,“RunAsUser”是要以哪个用户身份运行任务,“Password”是该用户的密码。
2. 删除任务调度要删除一个任务调度,可以使用以下命令:schtasks /delete /tn TaskName /f```其中,“TaskName”是要删除的任务的名称,“/f”参数表示强制删除。
3. 修改任务调度要修改一个任务调度,可以使用以下命令:```schtasks /change /tn TaskName /tr "NewCommand" /sc NewScheduleType /st NewStartTime /sd NewStartDate /ed NewEndDate /ru NewRunAsUser /rp NewPassword```其中,“TaskName”是要修改的任务的名称,“NewCommand”是新的命令,“NewScheduleType”是新的调度类型,“NewStartTime”是新的开始时间,“NewStartDate”是新的开始日期,“NewEndDate”是新的结束日期,“NewRunAsUser”是新的运行用户,“NewPassword”是新用户的密码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
译通过 。回调函数必须定义为如下的形式 : void PASCAL User Proc ( U IN T , U IN T , DWORD dwUserData ,DWORD ,DWORD) ;
只须注意 dwUserData 参数 ,它作为传给回调函数 的用户数据 ,其余参数可不予理会 。
2 Windows 内部系统时钟管理函数的使用
第 4 期 马丽红等 : Windows 编程中高精度定时的实现
53
Kill Timer ( ) ;
}
BOOL CMM Timer : : Set Timer (U IN T wAcc) {
Kill Timer ( ) ;
TIM ECAPS tc ; / / 通过 time GetDevCap 函数查询系统分辨率的 取值范围
}
void CMM Timer : : Kivent ID) {
time Kill Event (m- w Timer Event ID) ;
m- w Timer Event ID = 0 ;
}
} 在链接时 ,必须加入 winmm. lib 库 ,才能编
m- wAccuracy = 0 ;
}
}
BOOL CMM Timer : : Set Event ( U IN T wRes ,
L P TIM ECALLBAC K lpCall ,DWORD dwData)
{
m- w Timer Event ID = timeSet Event ( wRes ,/ / 指定的时间或时间周期间隔
① 收稿日期 : 2002207215 作者简介 : 马丽红 (1973 - ) ,女 , 内蒙赤峰人 ,鞍山科技大学助教 ,主要从事计算机实时监控研究 1
© 1995-2004 Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.
( FARPROC) Timer Func ,m- h Instance) ; / / 创建系统时钟 m- h Timer = m-fpCreateSysTimer (wRes ,
m-fp Timer Proc) ;
} void CSysTimer : : Kill Timer ( ) {
if (m- h Timer) { / / 删除前面由 CreateSystem Timer 创建/ / 的 系统时钟
类 ,具体说明以上函数的用法 ,该定时器类可以完 成与系统定时器一样的功能 。
# include < st dio . h > # include < mmsystem. h > class CMM Timer{/ / 定时器类
/ / 保存定时器的分辨率 U IN T m- wAccuracy ; / / 保存定时器事件句柄 U IN T m- w Timer Event ID ; public : CMM Timer (U IN T wAcc = 1) ; ~ CMM Timer ( ) ; / / 建立指定分辨率的定时器 BOOL Set Timer (U IN T wAcc) ; / / 删除已建立的定时器 void Kill Timer (void) ; / / 建立指定时间周期间隔的定时器事件 BOOL Set Event (U IN T wRes ,
m-fp KillSysTimer (m- h Timer) ; m- h Timer = 0 ; } if (m-fp Timer Proc) { 释放回调函数的实例地址
m-fpCreateSysTimer ; / / 保存 KillSystem Timer 函数的地址 static L P KILL S YSTEM TIM ER m-fp KillSysTimer ; public : CSysTimer ( HINSTANCE) ; ~CSysTimer ( ) ; / / 建立指定时间周期间隔的定时器事件 BOOL Set Timer ( WORD ,FARPROC) ; / / 删除已建立的定时器事件 void Kill Timer ( ) ; }; L PCREA TES YSTEM TIM ER CSysTimer : : mfpCreateSysTimer = NULL ; L P KILL S YSTEM TIM ER CSysTimer : : m-fp Kill2 SysTimer = NULL ;
1 Windo ws 多媒体定时器的使用
在 Windows 多媒体扩展组件中有一个高分 辨率的定时器 ,它可以达到毫秒级的分辨率 ,称之 为多媒体定时器[3 ] 。由于每个多媒体定时器都 有它自己的线程 ,可以不受任何挂起消息的影响 就直接调用回调函数 ,且它不依赖于消息机制发 送的 WM- TIM ER 消息 ,因此多媒体定时器可以 产生更为精确的结果 。下面通过建立一个定时器
不过在某种场合 ,特别是在对时间精度要求 较高的情况下 ,通过以上两种方法来实现时间控 制所产生的效果往往差强人意 ,这主要是因为受 PC 的内部时钟默认速率限制 ,以及与 Windows 的多任务环境保持一致所决定的 。在 Windows 中 ,仍然有高精度定时的解决办法 ,只不过这些技 术使用不多 ,或者有些根本未公开而已 。下面介 绍两种 Windows 下高精度时钟控制的方法 。
} CSysTimer : :~CSysTimer ( ) {
Kill Timer ( ) ; }
BOOL CSysTimer : : Set Timer ( WORD wRes , FARPROC Timer Func) {
先删除已创建的系统时钟 ,如有的话 Kill Timer ( ) ; / / 创建回调函数 Timer Func 的实例地址 m-fp Timer Proc = MakeProc Instance (
/ / 保存应用程序实例句柄 HINSTANCE m- h Instance ; HANDL E m- h Timer ;保存系统时钟句柄
/ / 保存回调函数的实例地址 FARPROC m-fp Timer Proc ; / / 保存 CreateSystem Timer 函数的地址 static L PCREA TES YSTEM TIM ER
L P TIM ECALLBAC K lpCall , DWORD dwData) ; / / 删除已建立的定时器事件 void Kill Event ( ) ; }; CMM Timer : :CMM Timer (U IN T wAcc) { m- w Timer Event ID = 0 ; Set Timer (wAcc) ; } CMM Timer : : ~CMM Timer ( ) { Kill Event ( ) ;
timeBeginPeriod ( m- wAccuracy) ;
return TRU E ;
}else
ret urn FAL SE ;
}
void CMM Timer : : Kill Timer (void) {
if (m- wAccuracy) {
time EndPeriod (m- wAccuracy) ;
第 23 卷 第 4 期 吉 林 工 学 院 学 报 Vol. 23 No. 4 2002 年 12 月 J OU RNAL OF J IL IN INSTITU TE OF TECHNOLO GY Dec. 2002
摘 要 : 介绍了 Windows 编程中两种高精度时钟控制的实现方法 ,可达到毫秒级的时间分辨率 ,给出了较为 完整的例子 ,完全能应用于实际编程中 。 关键词 : Windows 编程 ; 时间分辨率 ; 高精度时钟 中图分类号 : TP301 文献标识码 : A
0 引 言
在 Windows 编程中提供了多种可供选择的 时间控制方法 。其中一种方法是基于 Windows 中保 留 的 毫 秒 计 时 器[1 ] , 程 序 代 码 可 以 通 过 Get TickCount ( ) 函数读取系统时间变量的值实 现对时间的控制 ;另一种方法是使用 Windows 的 系统定时器 ,程序代码中可以使用 Set Timer ( ) 函 数来定义一个以毫秒计数的定时器[2 ] ,应用程序 就可以周期性地获得通知 ,并采取相应行动 。以 上两种技术都是应用最为普遍的方法 ,也是 Win2 dows 文档推荐采用的方法 。
if (time GetDevCaps ( &tc ,
sizeof ( TIM ECAPS ) ) = = TIM ERR- NO ER2
ROR) { / / 确保指定的分辨率在系统取值范围内
m-wAccuracy = min ( max ( tc. w PeriodMin ,
TIM ER-ACCU RAC Y ) , tc. w PeriodMax ) ;
在 Windows 系统驱动模块 S YSTEM. DRV 中存放着管理系统时钟的函数[4 \ 〗,我们可以从 S YSTEM. DRV 模块中取得相关的函数地址来使 用 。使用这些 Windows 内部函数 ,实质上是对管 理系统时钟的 8253 计时记数芯片进行重新编程 , 修改其硬件中断来完成预期的任务 。下面仍然通 过构造一个时钟类来说明这些管理系统时钟内部 函数的用法 : typedef FAR PASCAL ( 3 L PCREA TES YSTEM TIM ER ) ( WORD , FARPROC) ; typedef WORD FAR PASCAL ( 3 L P KILL S YSTEM TIM ER) ( WORD) ; class CSysTimer{/ / 时钟类
© 1995-2004 Tsinghua Tongfang Optical Disc Co., Ltd. All rights reserved.