文档章节

VC中加入定时机制的几种方法

rise-worlds
 rise-worlds
发布于 2016/06/20 13:40
字数 1731
阅读 0
收藏 0

定时机制是指在程序运行当中间隔特定的时间引发指定的事件。在DOS下编程时,主要依靠时钟中断Int 8及其调用中断 Int 1cH来实现,应用程序通过修改这些系统中断来达到实现定时触发。而在Windows下,若想象在DOS下肆无忌惮的修改系统是不现实的,那么应当如何实现定时机制呢?下面在下就在学习当中的几点体会谈谈这个问题,提出几种方案供大家参考。

第一种方案是大家熟悉的截获定时消息的途径。在Windows提供给我们使用的系统资源当中,有一种称为“定时器(Timer)”的特殊资源,在申请了这类资源的程序当中每间隔一段时间会接收到值为WM_TIMER的消息。需要定时执行的代码可以放在该消息的处理部分。如果在VC中,我们可以具体按照以下步骤实现这一目的:

  1. 利用MFC AppWizard创建一个标准的工程,接受所有缺省选项。名为s1
  2. 在Classview中选中“CMainFrame”类,然后按Ctrl+W激活ClassWizard,在“Message Map”选项卡中Class Name选“CMainFrame”,接着在“Message”中选“WM_TIMER”,最后按下“Add Funcation”。以上步骤加入了对WM_TIMER消息的映射处理。
  3. 回到Classview中,双击“OnCreate”成员函数,在函数的末尾添加申请Timer的语句:
    SetTimer(100,1000,NULL);//申请一个标识值为100的Timer,定时间隔为1000毫秒(1秒)。
  4. 在“Classview”中双击OnTimer函数,输入要定时实现的代码。本例子中为:
    MessageBeep(1000);;//每隔一秒发出通告声
  5. 编译并执行之,我们可以每隔一秒就听到声音。这正是我们在OnTimer函数内要求执行的。

实际当中,我们可以将“MessageBeep(1000);”换成任何我们想完成的任务,譬如定时存盘等。

第二种方案也利用Timer资源,但却是采用已经编写好的代码��我们可以加入一个具有定时功能的组件至当前工程当中。这种方法特别适用于基于对话框的工程。具体步骤如下:

  1. 利用MFC AppWizard创建一个基于对话框的工程,其余接受所有缺省选项。名为s2。
  2. 在ResourceView中,双击IDD_S2_DIALOG,显示对话框,将其中的“To do:”改为“定时触发演示的例子”,表明工程的作用。
  3. 右击对话框编辑区,在弹出的右键菜单中选择“Insert ActiveX Control”,从弹出的列表框中选择“Timer Object”,确定后会在对话框内出现一个Timer对象。
  4. 我们右击Timer对象,从弹出的菜单中选择“Properties”,接着选“All”选项卡,将其中的Interval值设为5000,即每隔5秒发生一次Timer事件。
  5. 回到对话框编辑界面,双击Timer,产生一个CS2Dlg::OnTimerTimer1成员函数,接受缺省值,并在函数实现部分输入:
    MessageBox("定时触发消息框","定时演示" ,MB_OK);
  6. 编译并运行此工程,将会在产生的对话框运行期间,每隔5秒弹出一个消息框。

同样,我们可以以任何自己的代码来替换5中的消息框语句。详细见附例s2。

第三种方法是采用线程技术。众所周知,Windows 9X是一个基于多线程的多任务操作系统,在内核中以线程作为调度的基本单位,由系统分时间片进行调度。利用这一点,我们可以在程序当中创建一个“司职”计时的线程,通过线程间的同步来定时触发我们要完成的任务的代码。不象前两种方法需要至少有一个窗口作为接受消息的主窗口,采用线程技术实现定时触发将免去创建窗口的麻烦以及带来的系统各种资源的消耗。下面我们来举一个例子来说明这个问题:我们在CmyApp类的Initstance成员中不建立主窗口而是创建一个工作线程,该线程休眠一定的时间后,自动调用主线程的SomeThing函数。为了支持线程的运行,我们需要给CmyApp类增加相应的线程函数。下面,我们还是一步一步的实现:

  1. 利用MFC AppWizard创建一个标准工程,其中为不产生多余的代码,不选文档/视图支持,并选择单文档。工程名为S3。
  2. 在CS3App:: InitInstance()中用“/* … */”注释掉“return TRUE;”之前的所有代码。这是为了不建立窗口。并添加以下代码:
    ExitFlag=TRUE;//是否结束主线程的循环的标志变量。因为子线程严重依赖主线程,所以在本例子中为了避免没有主窗口而提前结束应用程序,从而使子线程无法存在,所以给主线程一个循环,知道全局变量ExitFlag在子线程退出前被设置成FALSE为止.
    StartThread();//启动线程
    do{}while(ExitFlag);//直到结束子线程
    ::MessageBox(NULL,"主线程结束!","定时触发演示",MB_OK);
    return TRUE;
  3. 在Globals中增加一标志变量“ExitFlag”,类型为BOOL。它被主线程用来判断是否结束自身运行。
  4. 通过ClassView在CS3App的Public部分声明以下函数:
    void StartThread(void); //启动线程
    static UINT ThreadFunction(void); //主要执行代码的函数
    static UINT StaticThreadFunc(LPVOID lpparam);//设置线程时用到的函数
    需要特别指出的是,用AfxBeginThread进行线程设置时,第一参数必须象本例所指出的那样声明为Static ,不然参数转换的错误会扰得你不得安宁。
  5. 在StartThread中输入如下代码:
    AfxBeginThread(StaticThreadFunc,this);//建立并启动线程
  6. 在StaticThreadFunc中输入如下代码:
    return ThreadFunc();//调用完成主要线程代码的函数,注意一定要是Static.
  7. 实现ThreadFunction:
    int i;
    i=5;//触发5次
    while(i--)
    {
    Sleep(5000);//间隔5秒
    ::MessageBox (NULL,"我被定时触发了!","定时触发演示",MB_OK);
    }
    ExitFlag=FALSE;//ExitFlag是一全局变量,通知主线程结束运行。
    return 0;
    }
  8. 编译并运行工程,将看不到应用程序窗口,但可以看到每隔5秒,桌面上出现一个消息框,5次后弹出主线程结束的消息框。

以上即本人在学习当中解决 Windows下实现定时触发而采取的一些办法,各自方法的特点也在介绍当中指出。希望所述能给大家一点帮助,更希望能得到大家的指正。如果您有什么意见和设想,欢迎发E-Mail给我(yangshanhe@21cn.com)。

==

很早之前2000年的拙作,集在一起,免得自己都不清楚干过什么。

本文转载自:http://www.cnblogs.com/flying_bat/archive/2007/11/10/955350.html

共有 人打赏支持
rise-worlds

rise-worlds

粉丝 2
博文 1755
码字总数 0
作品 0
深圳
程序员
私信 提问
VC++获得微秒级时间的方法与技巧探讨

获得微秒级的时间 收藏 Win 下建议如下方式: http://www.vckbase.com/document/viewdoc/?id=1301 VC中基于 Windows 的精确定时 中国科学院光电技术研究所 游志宇 在工业生产控制系统中,有许...

长平狐
2013/01/06
183
0
iOS----------viewcontroller中的dealloc方法不调用

ios的viewcontroller生命周期是 init -> loadView -> viewDidLoad -> viewWillAppear -> viewDidAppear -> viewWillDisappear -> viewDidAppear -> viewDidUnload -> dealloc 当我们使用NSN......

iOS张文权
2018/07/30
0
0
C/C++ 函数中参数和返回值传递简记

原文:C/C++ 函数参数和返回值传递机制 作者:Breaker 简单记录一下 C++ 函数调用中,参数和返回值传递的方法和步骤 参数传递 函数参数的传递是初始化语义:用调用者的实参去初始化函数的形参...

晨曦之光
2012/05/23
171
0
【转】ActiveX控件注册的几种方法

from:http://hi.baidu.com/estellejiang/blog/item/af16e862bbd1d3d7e6113aa7.html ActiveX控件是一个动态链接库,是作为基于COM服务器进行操作的,并且可以嵌入在包容器宿主应用程序中, Ac...

夏春涛
2009/10/12
0
0
WM_CTLCOLOR消息的用法

很多人都觉得自己的程序的界面不那么美观,往往VC默认产生的对话框比较单调,因此很多人往往找到很多其它的控件对对话框进行美化修饰,例如给静态控件设置字体,设置背景颜色等等, 其实这些...

ryany
2011/02/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

jenkins安装

https://my.oschina.net/u/593517/blog/1797968 jenkins 安装 https://my.oschina.net/u/593517/blog/3028175 GIT 安装 https://my.oschina.net/u/593517/blog/3028179 maven 安装 插件安装 ......

Gm_ning
25分钟前
2
0
小言服务端解决方案-监控

框架保证方向,整体包容细节 为保证服务端运行平稳正常,owner应使得系统应保有相应的监控:系统监控,业务监控。而服务运行的平稳高效是否有保障跟监控粒度又成直接的正比关系。本文仅针对开...

重城重楼
37分钟前
2
0
搜索引擎(Elasticsearch搜索详解)

学完本课题,你应达成如下目标: 掌握ES搜索API的规则、用法。 掌握各种查询用法 搜索API 搜索API 端点地址 GET /twitter/_search?q=user:kimchy GET /twitter/tweet,user/_search?q=user:...

这很耳东先生
今天
7
0
浅谈如何减少GC的次数

GC会stop the world。会暂停程序的执行,带来延迟的代价。所以在开发中,我们不希望GC的次数过多。 本文将讨论如何在开发中改善各种细节,从而减少GC的次数。 (1)对象不用时最好显式置为 Nu...

浮躁的码农
今天
1
0
jpa 自定义返回对象

任何ORM框架都少不了开放自定义sql的问题。jpa自然也不例外,很多场景需要写复杂sql的。 首先定义一个方法签名,然后打上@Query注解。像下面这样,需要注意nativeQuery,这个表示query中的字...

朝如青丝暮成雪
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部