首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

多线程怎么实现精确计时

2012-10-05 
多线程如何实现精确计时我是学习MFC的小菜鸟~~现在遇到了一些问题 求各位大虾指教问题如下:在MFC中 我用se

多线程如何实现精确计时
我是学习MFC的小菜鸟~~现在遇到了一些问题 求各位大虾指教
问题如下:在MFC中 我用settimer函数做计时器 每隔一定时间 触发计时 调用ontimer函数 显示一幅DIB位图 
  可是 settimer计时不够准确 现在 想改用多线程 可是 我查了好多资料 还是很混乱 请问有没有大虾可以帮忙提点一下 在此 先谢过啦

[解决办法]
GetTickCount
[解决办法]
SetWaitableTimer
[解决办法]

C/C++ code
//文件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()将之释放。

热点排行