利用线程制作简单定时器

控制/MCU

1865人已加入

描述

定时器是在某个时间到了执行一次代码,他的执行与否完全取决于时间,而线程os回给他分配内存空间后,他会完全向主线程一样去线程队列中等待,因此,定时器是抢占式的执行,只要时间到了,由于很高的优先级,会立马执行,影响程序执行速度,而线程则会和其他线程进入排队等待。

两者用途也不同,线程是为了并发执行,实现程序的同步,而定时器只是做一些必须定期做的工作,如刷新窗口之类的。但如果用定时器来更新时间的话则会得不偿失。因为晚更新1秒2秒没有关系(在要求不严格的情况下)。

因此想开一个线程来更新时间。

1、定义一个自己的宏,用于消息映射。

#define MSG_MY_TIME WM_USER+1

2、声明并定义一个线程函数。

volatile bool TimeThreadRun

void TimeThreadFun(LPVOID lpParam)

{

TimeThreadRun = true;

while(TimeThreadRun)

{

PostMessage((HWND)lpParam, MSG_MY_TIME, 0, 0);

Sleep(1000);

}

}

3、在相应的类中定义消息映射,消息映射函数。

afx_msg LRESULT OnMyTime(WPARAM, LPARAM);

BEGIN_MESSAGE_MAP(。。。)

ON_MESSAGE(MSG_MY_TIME, OnMyTime)

END_MESSAGE_MAP()

LRESULT OnMyTime(WPARAM wp, LPARAM lp)

{

。。。。。。

}

4、在某一个函数中开启线程。其中this-》m_hWnd是该类窗口句柄。

hTimeThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)TimeThreadFun, (LPVOID)(this-》m_hWnd), 0, &timeThreadID);

5、即可得到一个多线程定时器。关闭时,把TimeThreadRun设为false即可。

其实.net有为我们准备专门的Timer定时器,功能也能满足大部分的需求,只是有时候可能我们只需要一个简单的定时要求就可以了,但是定时器那边参数又很多,记不住怎么办?这个时候我们就可以利用一个简单的线程来满足我们的需求了。

首先,我们先创建一个简单的线程

执行之后就可以看到这样的结果

根据需求,如果只需要执行一次话,其实我们只要在线程执行方法前加一个线程休眠就可以了

然后我们看看结果

休眠三秒后再执行的后面的方法,然后到这个时候线程就已经运行完了。

如果我们的需求是不止一次的话,我们可以适当的加一些循环

然后就可以看到我们如此循环后的执行

看,是不是一个简单的定时任务就可以这样执行了

可能这会有人想问有关线程完成后的一个的回收问题,首先C# 是面向对象语言,它自带GC(垃圾回收器),系统会在一定时间去检测,一些变量,对象如果长时间没用,它就会自动清除掉。

其次线程运行完之后将自动终止,会由CLR来决定什么时候销毁来释放内存和其他资源,一般的说,当你的资源不够或有更高优先级的要求时,内存会被释放,以避免影响CPU性能。如果你实在不放心,用abort终止掉它吧!

th.Abort();

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分