多线程如何实现精确计时
我是学习MFC的小菜鸟~~现在遇到了一些问题 求各位大虾指教
问题如下:在MFC中 我用settimer函数做计时器 每隔一定时间 触发计时 调用ontimer函数 显示一幅DIB位图
可是 settimer计时不够准确 现在 想改用多线程 可是 我查了好多资料 还是很混乱 请问有没有大虾可以帮忙提点一下 在此 先谢过啦
[解决办法]
GetTickCount
[解决办法]
SetWaitableTimer
[解决办法]
//文件A,B, A由一串小写字母构成, B开始为空////线程1 从A读取字母 ,发给线程2//线程2 将小写转大写, 发给线程3//线程3 将大写转小写 ,写入文件B////最后A=B#include <Windows.h>#include <stdio.h>#include <stdlib.h>#include <string>using namespace std;const char * A_file = "C:\\Documents and Settings\\Administrator\\桌面\\a.txt";const char * B_file = "C:\\Documents and Settings\\Administrator\\桌面\\b.txt";typedef enum tag_CURRENTSTATE{ Thread1On = 0, Thread1OFF = 1, Thread2On = 2, Thread2OFF = 3, Thread3On = 4, Thread3OFF = 5,}CURRENTSTATE;CURRENTSTATE state = Thread1On;string fileBuffer;DWORD WINAPI ThreadFunc1( LPVOID pvAny ){ FILE * pFile = fopen( A_file , "rb" ); if ( NULL == pFile ) { return -1; } while(1) { char temp [128] = {0}; fgets( temp , 128 , pFile ); if ( strcmp( temp , "" ) != 0 ) { fileBuffer += temp; } if ( feof( pFile ) ) { break; } } state = Thread1OFF; return 0;}DWORD WINAPI ThreadFunc2( LPVOID pvAny ){ while (1) { if ( Thread1OFF == state ) { string temp; state = Thread2On; for ( int i = 0 ; i < fileBuffer.size() ; ++i ) { char cTemp = fileBuffer.at( i ); temp.append( 1 , cTemp + ( 'A' - 'a' ) ); } fileBuffer = temp; state = Thread2OFF; } if ( Thread2OFF == state ) { break; } Sleep( 100 ); } return 0;}DWORD WINAPI ThreadFunc3( LPVOID pvAny ){ while (1) { if ( Thread2OFF == state ) { state = Thread3On; FILE * pFile = fopen( B_file , "wb" ); string temp; for ( int i = 0 ; i < fileBuffer.size() ; ++i ) { char cTemp = fileBuffer.at( i ) - 'A' + 'a'; temp.append( 1 , cTemp ); } fileBuffer = temp; fwrite( fileBuffer.c_str() , sizeof( char ) , fileBuffer.size() , pFile ); fclose( pFile ); pFile = NULL; state = Thread3OFF; } Sleep( 100 ); if ( Thread3OFF == state ) { break; } } return 0;}int main(){ DWORD dwThreadID1 = 0, dwThreadID2 = 0, dwThreadID3 = 0; HANDLE hThread1 = CreateThread( NULL , 0 , ThreadFunc1 , NULL , 0 , &dwThreadID1 ); HANDLE hThread2 = CreateThread( NULL , 0 , ThreadFunc2 , NULL , 0 , &dwThreadID2 ); HANDLE hThread3 = CreateThread( NULL , 0 , ThreadFunc3 , NULL , 0 , &dwThreadID3 ); system( "pause" ); return 0;}
[解决办法]
使用多媒体定时器timeSetEvent()函数,该函数定时精度为ms级。利用该函数可以实现周期性的函数调用。如示例工程中的Timer6和Timer6_1。函数的原型如下:
MMRESULT timeSetEvent(UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, WORD dwUser, UINT fuEvent)
该函数设置一个定时回调事件,此事件可以是一个一次性事件或周期性事件。事件一旦被激活,便调用指定的回调函数, 成功后返回事件的标识符代码,否则返回NULL。函数的参数说明如下:
uDelay:以毫秒指定事件的周期。
Uresolution:以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为1ms。
LpTimeProc:指向一个回调函数。
DwUser:存放用户提供的回调数据。
FuEvent:指定定时器事件类型:
TIME_ONESHOT:uDelay毫秒后只产生一次事件
TIME_PERIODIC :每隔uDelay毫秒周期性地产生事件。
具体应用时,可以通过调用timeSetEvent()函数,将需要周期性执行的任务定义在LpTimeProc回调函数 中(如:定时采样、控制等),从而完成所需处理的事件。需要注意的是,任务处理的时间不能大于周期间隔时间。另外,在定时器使用完毕后, 应及时调用timeKillEvent()将之释放。