« タイマーをOS毎に切りかえるには! | トップページ | PCの電源を入れても立ち上がらない時… »

2005年8月20日 (土)

タイマー処理は、こんな感じ?

最近、書いていることが硬いのぉ~。

いかん、いかん。

もっと、チャラチャラ書くぞぉ!

さて!

今回は、最終回!

ようやくタイマーが完成する!

多分…。

でも、ボケのプログラムだから
ボケボケなのは、
お約束だょぉ!

#pragma comment( lib, "WinMm.lib" )
//--------------------------------------
#include    <Windows.h>
#include    <StdIo.h>
//--------------------------------------
#define        WAIT_TIME        ( 1000 / 60 )
#define        LIST_MAX        1000
//--------------------------------------
DWORD ( WINAPI* TimerGet )( void );
//--------------------------------------
void TimerCreate( void )
{
    OSVERSIONINFO    OsVersionInfo;

    timeBeginPeriod( 1 );
    OsVersionInfo.dwOSVersionInfoSize    = sizeof( OsVersionInfo );
    GetVersionEx ( &OsVersionInfo );
    TimerGet    = ( OsVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ) ? GetTickCount : timeGetTime;
}
//--------------------------------------
void TimerRelease( void )
{
    timeEndPeriod( 1 );
}
//--------------------------------------
void TimerWait( void )
{
    static DWORD    Back    = 0;
    DWORD            Wait;

    if( ( Wait = TimerGet( ) - Back ) < WAIT_TIME )
        Sleep( WAIT_TIME - Wait );

    Wait    = TimerGet( ) - Back;
    Back    += Wait - ( Wait % WAIT_TIME );
}
//--------------------------------------
void main( void )
{
    DWORD            Now, Old, List[LIST_MAX];
    int                Count;

    // 初期化
    TimerCreate( );
    Count    = 0;
    Old        = 0;

    // メイン処理ループ
    while( Count < LIST_MAX )
    {
        TimerWait( );

        // メイン処理
        List[Count++]    = ( Now = TimerGet( ) ) - Old;
        Old    = Now;
    }

    for( Count = 0 ; Count < LIST_MAX ; Count++ )
        printf( "%d\n", List[Count] );

    TimerRelease( );
}

取り合えず完成か?

いや!

完成したことにしよう!

98では、これでいい感じに動くんだもん!

…。

でも、2Kだといい感じに動いてくれない…。

…。

「Sleep」のタイマーは、「GetTickCount」を
ベースにしているらしく2Kだと
精度が出ない…。

と言うことで以下のように修正することで
解決するのだが…。

//--------------------------------------
void TimerWait( void )
{
    static DWORD    Back    = 0;
    DWORD            Wait;

    while( ( TimerGet( ) - Back ) < WAIT_TIME )
        Sleep( 0 );

    Wait    = TimerGet( ) - Back;
    Back    += Wait - ( Wait % WAIT_TIME );
}

だが、これはこれで問題がある。

「プロセッサ使用率」が100%に
なってしまうのだ…。

「Sleep」が入れてあるので
他のプロセスやスレッドが十分に
実行できるのだが…。

と言うことで気にしないというのも手だ!

ゲームなんかは、これで良いんじゃない?

でも、長時間実行する計測する処理の場合には
ちょっとまずいかな?

2Kでも精度がでる「Sleep」を
自作しないとならないのかぁ…。

そいつは、気が向いたらと言うことで…。

…。

はあ、疲れた…。

お休みなさい…。

|

« タイマーをOS毎に切りかえるには! | トップページ | PCの電源を入れても立ち上がらない時… »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/108365/5549177

この記事へのトラックバック一覧です: タイマー処理は、こんな感じ?:

« タイマーをOS毎に切りかえるには! | トップページ | PCの電源を入れても立ち上がらない時… »