利用mfc编程来开发图形应用程序的基本步骤主要有几步

利用mfc编程来开发图形应用程序的基本步骤主要有几步,第1张

开发简单 MFC 应用程序的步骤主要有:

1. 前期策划---确定应用程序要执行哪些基本任务

2. 新建项目---用VS新建MFC项目,设置初始属性。

3. 界面设计---使用"对话框编辑器"设计界面:添加想要的对话框控件,设置它们的属性,然后精确调节它们的位置和大小以看起来更加美观。

4. 设计实现---为控件添毕槐物加成员变量,同时添手液加必需的程序变量以及控件的事件处理程序,然后为你的程序编写实现代码以便让它做你想要的事情。

5. 测试程序---试运行程序并明则检查其是否按预期工作。如果存在问题,需进行修改。

如你的电脑要在22:00关机,可以选择“开始→运行”,输入“at 22:00 Shutdown -s”,

这样,到了22点电脑就会出现“系统关机”对话框,默认有30秒钟的倒计时并提示你保存工

作。如果你想以倒计时的方式关机,可以输入“Shutdown.exe -s -t 3600”,这里表示60

分钟后自动关机,“3600”代含做表60分钟。

设置好自动关机后,如果想取消的话,可以在运行中输入“shutdown -a”。另外输入

“shutdown -i”,则可以打开设置自动关机对话框,对自动关机进行设置。

Shutdown.exe的参数,每个都具有特定的用途,执行每一个都会产生不同的效果,比如

“-s”就表示关闭本地计算机,“-a”表示取消关机 *** 作,下面列出了更多参数,大家

可以在Shutdown.exe中按需使用。

-f:强行关闭应用程序

-m \\计算机名:控制远程计算机

-i:显示图形用户界面,但必须是Shutdown的第一个选项

-l:注销当前用户

-r:关机并重启

-t 时间:设置关机倒计时

-c "消息内容":输入关机对话框中的消息内容(不能超127个字符)

有时候,我们需要定时关闭计算机,下面介绍一个在Windows XP下实现定时关机的简单方

法。

指定系统在22分钟后自动关闭:点击“开始→运行”,在“打开”中输入命令“Shutdown

-s -t 1320”(注意:引号不输入,参数之间有空格,1320的单位是秒),单击“确定”

按钮即可。

指定系统在某谈梁衡个时间(比如12:00)自动关闭:在“打开”中输入命令

“at 12:00 Shutdown -s”即可。

取消定时关机:在“打开”中输入命令“Shutdown -a”即可。

能的实现都是使用“Shutdown”命令实现的,shutdown的参数是在命令行窗口中输入

“shutdown”。笔者认为最有用的是“-i”参数,可以调出“远程关机对话框”,

能方便地实现局域网内计算机的远程关机,有兴趣的朋友可以试一试。

开始-程序-附件-系统工具-计划任务-添加任务计划-下一步-浏览

-c:\windows\system32\shadow.exe-下一步-选好要关机的时间,

下一步-输入用户名和密码,只要是系统里有的用户就行,但一定要有密码,

没有也要设一个,下一步,选上“在完成时打开此任务的高级属性”,

在运行栏后渣誉面加上“ -S”引号不要哦。

比如你的电脑要在22:00关机,可以选择“开始→运行”,输入“at 22:00 Shutdown -s”,

这样,到了22点电脑就会出现“系统关机”对话框,默认有30秒钟的倒计时并提示你保存工

作。如果你想以倒计时的方式关机,可以输入“Shutdown.exe -s -t 3600”,这里表示60

分钟后自动关机,“3600”代表60分钟。

设置好自动关机后,如果想取消的话,可以在运行中输入“shutdown -a”。另外输入

“shutdown -i”,则可以打开设置自动关机对话框,对自动关机进行设置。

Shutdown.exe的参数,每个都具有特定的用途,执行每一个都会产生不同的效果,比如

“-s”就表示关闭本地计算机,“-a”表示取消关机 *** 作,下面列出了更多参数,大家

可以在Shutdown.exe中按需使用。

-f:强行关闭应用程序

-m \\计算机名:控制远程计算机

-i:显示图形用户界面,但必须是Shutdown的第一个选项

-l:注销当前用户

-r:关机并重启

-t 时间:设置关机倒计时

-c "消息内容":输入关机对话框中的消息内容(不能超127个字符)

有时候,我们需要定时关闭计算机,下面介绍一个在Windows XP下实现定时关机的简单方

法。

指定系统在22分钟后自动关闭:点击“开始→运行”,在“打开”中输入命令“Shutdown

-s -t 1320”(注意:引号不输入,参数之间有空格,1320的单位是秒),单击“确定”

按钮即可。

指定系统在某个时间(比如12:00)自动关闭:在“打开”中输入命令

“at 12:00 Shutdown -s”即可。

取消定时关机:在“打开”中输入命令“Shutdown -a”即可。

能的实现都是使用“Shutdown”命令实现的,shutdown的参数是在命令行窗口中输入

“shutdown”。笔者认为最有用的是“-i”参数,可以调出“远程关机对话框”,

能方便地实现局域网内计算机的远程关机,有兴趣的朋友可以试一试。

开始-程序-附件-系统工具-计划任务-添加任务计划-下一步-浏览

-c:\windows\system32\shadow.exe-下一步-选好要关机的时间,

下一步-输入用户名和密码,只要是系统里有的用户就行,但一定要有密码,

没有也要设一个,下一步,选上“在完成时打开此任务的高级属性”,

在运行栏后面加上“ -S”引号不要哦。

在需要按时间计划执行简单任务的情况下,Timer是最常被使用到的工具类。使用Timer来调度TimerTask的实现者来执行任务,有两种方式,一种是使任务在指定时间被执行一次,另一种是从某一指定时间开始周期性地执行任务。

下面是一个简单的Timer例子,它每隔10秒钟执行一次特定 *** 作doWork。

Timer timer = new Timer()

TimerTask task = new TimerTask (){

public void run() {

doWork()

}

}

timer.schedule (task, 10000L, 10000L)

可以看到,具体的任务由TimerTask的子类实现,Timer负责管理、执行TimerTask。

Timer 的使用

在不同的场景下,需要使用不同的Timer接口。如上所说,主要区分碰枯两种情况

1) 在指定时间执行任务,只执行一次

- public void schedule(TimerTask task, long delay)

- public void schedule(TimerTask task, Date time)

2)从指定时间开始,周期性地重复执行,直到任务被cancel掉。其中又分两种类型:

2.1) 一种是按上一次任务执行的时间为依据,计算本次执行时间,可以称为相笑闹洞对时间法。比如,如果第一次任务是1分10秒执行的,周期为5秒,因系统繁忙(比如垃圾回收、虚拟内存切换),1分15秒没有得到机会执行,直到1分16秒才有机会执行第二次任务,那么第3次的执行时间将是1分21秒,偏移了1秒。

- public void schedule(TimerTask task, long delay, long period)

- public void schedule(TimerTask task, Date firstTime, long period)

2.2) 另一种是绝对时间法,以用户设计的起始时间为基准,第n次执行时间为“起始时间+n*周期时间”。比如,在上面的情况下,虽然因为系统繁忙,第二执行时间被推后1秒,但第3次的时间点仍然应该是1分20秒。

- public void scheduleAtFixedRate(TimerTask task, long delay, long period)

- public void scheduleAtFixedRate(TimerTask task, Date firstTime,long period)

相对时间法,关注于满足短时间内的执行间隔,绝对时间法,则更关注在一个长时间范围内,任务被执行的次数。如果我们要编写一个程序,用timer控制文档编辑器中提示光标的闪烁,用哪种更合适? 当然是相对时间法。如果改用绝对时间法,当从系统繁忙状态恢复后,光标会快速连续闪烁多次,以弥补回在系统繁忙期间没有被执行的任务,这样的情况会用户来说比较难以接受。又如,每10分钟检查一次新邮件的到来,也适合于使用相对时间法。

Timer timer = new Timer()

TimerTask task = new TimerTask (){

public void run() {

displayCursor()

}

}

timer.schedule (task, 1000L, 1000L)//每秒闪弯型烁一次光标

作为对比,我们来考虑一种绝对时间法的应用场景——倒数任务,比如,要求在10秒内做倒数计时,每秒做一次doworkPerSecond *** 作,10秒结束时做一次doworkEnd *** 作,然后结束任务。

Timer timer = new Timer()

TimerTask task = new TimerTask (){

private int count=10

public void run() {

if(count>0){

doWorkPerSecond()

count--

}else{

doWorkEnd()

cancel()

}

}

}

timer. scheduleAtFixedRate (task, 1000L, 1000L)

Timer及相关类的内部实现

- Timer的内部会启动一个线程TimerThread。即使有多个任务被加入这个Timer,它始终只有一个线程来管理这些任务。

- TimerThread是Thread的子类。加入Timer的所有任务都会被最终放入TimerThread所管理的TaskQueue中。TimerThread会不断查看TaskQueue中的任务,取出当前时刻应该被执行的任务执行之,并且会重新计算该任务的下一次执行时间,重新放入TaskQueue。直到所有任务执行完毕(单次任务)或者被cancel(重复执行的任务),该线程才会结束。

- TaskQueue,由数组实现的二叉堆,堆的排序是以任务的下一次执行时间为依据的。二叉堆的使用使得TimerThread以简洁高效的方式快速找到当前时刻需要执行的TimerTask,因为,堆排序的特性是保证最小(或者最大)值位于堆叠顶端,在这里,queue[1]始终是下次执行时间(nextExecutionTime)最小的,即应该最先被执行的任务

比如,同一个timer管理两个任务task1和task2

timer.schedule (task1, 4000L, 10000L)

timer. scheduleAtFixedRate (task2, 2000L, 15000L)

则,TaskQueue中会有两个任务:task1和task2。task2会排在头部queue[1],当task2执行时间到,task2被执行,同时修改其nextExecutionTime =当前的nextExecutionTime +15000L(绝对时间法)并重新在二叉堆中排序。排序后,task1被放到头部。当task1执行时间到,task1被执行,并修改其nextExecutionTime =当前时间+10000L,然后重新在二叉堆中对其排序………

一个例子

当收到客户端请求时,服务端生成一个Response对象。服务端希望客户端访问该对象的间隔时间不能超过20秒,否则,服务端认为客户端已经异常关闭或者网络异常,此时销毁掉该对象并打印错误日志。每次访问都会重新开始计时。

class Response{

private TimerTask timeout

public void init(){

………

Timer timer = new Timer()

timeout = new TimeOutTask()

timer.schedule (timeout, 20000L)

}

public void invoke(){

timeout.cancel()//取消当前的timeout任务

….

timeout = new TimeOutTask()

timer.schedule (timeout, 20000L)//重新开始计时

}

void destroy(){

……..

}

class TimeOutTask extends TimerTask{

public void run() {

TraceTool.error(“Time out, destroy the Response object.”)

destroy()

}

}

}

因为Timer不支持对任务重置计时,所以此处采取了先cancel当前的任务再重新加入新任务来达到重置计时的目的。注意,对一个已经cancel的任务,不能通过schedule重新加入Timer中执行。TimerTask的状态机如下:

一个新生成的TimerTask其状态为VIRGIN,Timer只接受状态为VIRGIN的任务,否则会有IllegalStateException异常抛出。

调用任务的cancel方法,该任务就转入CANCELLED状态,并很快从TaskQueue中删除。对单次执行的任务,一旦执行结束,该任务也会从中删除。这意味着TimerTask将不再被timer所执行了。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12564008.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存