男男做视频网站,app优化是什么意思,北京哪家网站建设公司好,软件开发能力本文我们不用定时器。定时器会阻塞消息循环。先看需求#xff1a;
我们先看第一种#xff0c;有一个任务#xff0c;要求每1秒钟执行一次#xff0c;最常见的写法如下两种 bool bExitThread false;
DWORD WorkThread1(LPVOID param)
{while (false bExitThread){//// to…本文我们不用定时器。定时器会阻塞消息循环。先看需求
我们先看第一种有一个任务要求每1秒钟执行一次最常见的写法如下两种 bool bExitThread false;
DWORD WorkThread1(LPVOID param)
{while (false bExitThread){//// to-do 这里是执行任务的具体代码//Sleep(1000);}return 0;
}
或者如下
HANDLE hEventExit ::CreateEvent(NULL, FALSE, FALSE, _T(hEventExit));DWORD WorkThread1(LPVOID param)
{while (false bExitThread){DWORD nRet ::WaitForSingleObject(hEventExit, 1000);if (WAIT_TIMEOUT ! nRet){break;}////to-do 执行任务具体代码//}return 0;
}
勉强可以用了但是有明显缺点是当软件要退出时必须等待该线程1秒钟非常不实时。无法完成快速响应退出。很致命啊。
于是有了改进的写法如下两种 DWORD WorkThread2(LPVOID param)
{while (false bExitThread){//// to-do 这里是具体代码//for (int i 0; i 100; i){Sleep(10);if (bExitThread)break;}}return 0;
}或者如下
HANDLE hEventExit ::CreateEvent(NULL, FALSE, FALSE, _T(hEventExit));DWORD WorkThread1(LPVOID param)
{DWORD nCount 0;while (false bExitThread){DWORD nRet ::WaitForSingleObject(hEventExit, 10);if (WAIT_TIMEOUT ! nRet){break;}nCount;if (0 nCount % 100){////to-do 执行任务具体代码//}}return 0;
}
不得不说这两种改进方式的确做到了1秒钟执行1次任务也能做到当软件退出时能极快速的退出该线程。不得不说这种化整为零的好方式比前面第一种好了许多甚至你可以直接把睡眠或等待改成1毫秒就可以达到更低时延的快速退出线程。
但是假如需求做一下调整但有多个任务比如3个任务需要执行而且 任务1必须保证每1秒钟要执行一次(耗时忽略不计) 任务2必须保证每2秒钟要执行一次(耗时忽略不计) 任务3必须保证每3秒钟要执行一次(耗时忽略不计)
(不准使用定时器N个定时器定时器会导致一顿一顿的也不准开N个定时器再在里面各开1个线程), 我们怎么做到保证N个任务按如上要求执行还要能保证退出时线程能最快的退出。
事实上这才是我们现实需求中最最常见的。这个时候同样也可以用化整为零的多次Sleep或WaitForSingleObject来完成。比如如下巧用nCount计数来完成 HANDLE hEventExit ::CreateEvent(NULL, FALSE, FALSE, _T(hEventExit));DWORD WorkThread3(LPVOID param)
{bool bSet false;DWORD nCount 0;while (false bExitThread){DWORD nRet ::WaitForSingleObject(hEventExit, 1);if (WAIT_TIMEOUT ! nRet){break;}nCount;if (0 nCount % 1000){//// to-do Task1//}if (0 nCount % 2000){//// to-do Task2//}if (0 nCount % 3000){//// to-do Task3//}}return 0;
}
显然是达到了多个任务都可以按照指定的时间间隔频次执行而且还能做到软件退出时该线程也能快速的退出。
但假如需求再变一下只准开一个线程3个任务需求同上但是每个任务执行耗时不可忽略任务执行耗时1秒却不可中断。这个时候我们如何做到软件退出时最快的退出呢
显然软件正好退出时可能该线程刚好进入任务N执行执行1秒耗时不可中断必然需要等待。
显然这个时候需要做到快速优雅的退出就比较困难了。如果实在不想等待1秒的话我们可以直接PauseThread或TerminateThread来暂停或打断该线程的执行然后退出软件。这也不失是一种快速响应退出线程的好方法了。
虽然可以做到快速退出了但是有一个需求是没有满足的那就是
每隔1秒执行一次Task1每隔2秒执行一次Task2每隔3秒执行一次Task3
为什么呢因为这种方式有个弊端当第2秒时Task1执行耗时1秒它占了1秒导致了Task2往后延了1秒执行当第3秒时Task2Task3依次又顺延了许多秒并没有达到需求。所以这个时候只准开1个线程就很难实时满足需求了。只能改成开3个线程单独去处理了。
搁笔。如有疑问站内信联系