守时器是在某个时刻到了履行一次代码,他的履行与否彻底取决于时刻,而线程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();