利用线程制作简单定时器

定时器是在某个时间到了执行一次代码,他的执行与否完全取决于时间,而线程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();

英特尔、三星等涉足晶圆代工 台积电市场压力增大
Vishay推出用于直接IGBT安装的镀金属聚丙烯膜缓冲电容器
2019年iPhone将是具有增强现实能力的三个先进3D传感镜头
你了解Linux中7个判断文件系统类型的方法?
电力电容器的作用与规格型号
利用线程制作简单定时器
Facebook研发AR/VR触觉反馈手套
荣耀V40新品预热:搭载10亿色视网膜级超感屏
如何利用7系列GTX收发器实现SMPTE SDI呢?
MAX31782 系统管理微控制器
后米物联安灯系统解决方案
温彻斯特硬盘的前世今生
FPGA芯片的未来发展趋势会是怎样的
LCD拼接屏与led显示大屏的区别
如何排除DC-DC降压转换器的故障
动力电池的混合脉冲功率特性测试
八款热门的windows设计软件,用过一次就忘不了
LG G6将配备虹膜识别等前沿技术
指针式万用表的使用方法
虹科干货 | 打破传统!金融界黑科技—虹科Redis企业版数据库