控制/MCU
定时器是在某个时间到了执行一次代码,他的执行与否完全取决于时间,而线程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();
全部0条评论
快来发表一下你的评论吧 !