« 2005年8月 | トップページ | 2005年10月 »

2005年9月24日 (土)

なんとなくプラモデルメイク!(ケロロ軍曹の場合…)

後ろの奴の机の上に
プラモデルが積んである…。

『作んないの?』

『暇が無い。』

『作ろうか?』

『頼む。』

『失敗したらごめんね。』

『失敗したら弁償ね。』

『…。』

双方合意の上製作開始…。

で、なぜか『ケロロ軍曹』…。

CA0240318

アニメ見たら笑った…。

で、ボックスアートは、どう見てもアニメ風。

なぜ、漫画で無いのかは、突っ込まない事にする。

取り合えず箱の中身を出す。

CA0240320

色々入っている…。

袋を開ける。

CA0240321

色々入っている…。

取り合えず頭を組む・・・。

CA0240322

白目は怖い…。

腹を組む・・・。

CA0240323

何だか分からん…。

合体させる!

CA0240325

多分完成…。

ギミックが色々用意されている。

・目が切り替わる。
・手が各種差し替えられる。
・足が各種差し替えられる。
・SDガンダムのボディに顔差し替えられる。(アタッチメント付き)
・その他の人形の頭に差し替えられる。
・バズーカ・ケロボールなど付属品多数。

などなど…。

意外に盛り沢山。

楽しめるぞ!

『ケロロ軍曹』!

…。

後ろの机に飾られている。

…。

後ろの奴の机の上に
プラモデルが積んである…。

多分減らない…。

…。

Ca240369

今日もケロボールを手にペコポン侵略を
考えてはいない…。

| | コメント (0) | トラックバック (0)

2005年9月12日 (月)

「Sleep」の代替え処理は…

どうやったら…
「Sleep」の代替え処理が組めるかな~
と、考えながら幾年月…。

と言うほど日は経っていないが、
多分こうしたら同等品か?
と思えるものを組んでみました…。

多分大丈夫でしょう…。

多分…ですよ…。

動けばいいんです!

断っておきますが…
ボケプログラマーですから!
処理は、ボケボケです!

#pragma comment( lib, "WinMm.lib" )
//--------------------------------------
#include    <Windows.h>
#include    <StdIo.h>
//--------------------------------------
#define        WAIT_TIME        1
#define        LIST_MAX        1001
//--------------------------------------
HANDLE            TimerHandle;
DWORD            TimerID;
DWORD            TimerWait;
//--------------------------------------
//    ※解除するだけです。
static void CALLBACK TimerProc( UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2 )
{
    if( TimerWait != 0 )
        if( --TimerWait == 0 )
            ResumeThread( TimerHandle );
}
//--------------------------------------
void TimerInitial( void )
{
    OSVERSIONINFO    OsVersionInfo;
    HANDLE            Process;
    HANDLE            Thread;

    // マルチメディアタイマーとやらを起動します。
    TimerID    = timeSetEvent( 1, 1, TimerProc, 0, TIME_PERIODIC );

    // 自分のスレッドハンドルを取得します。
    Process    = GetCurrentProcess( );
    Thread    = GetCurrentThread( );
    DuplicateHandle( Process, Thread, Process, &TimerHandle, 0, FALSE, DUPLICATE_SAME_ACCESS );
}
//--------------------------------------
BOOL TimerRelease( void )
{
    timeKillEvent( TimerID );
    CloseHandle( TimerHandle );
    return TRUE;
}
//--------------------------------------
void TimerSleep( DWORD Wait )
{
#if 0    // セーフティ?
    if( Wait < 2 )
        Wait    = 2;
#endif

    TimerWait    = Wait;
    SuspendThread( TimerHandle );
}
//--------------------------------------
void main( void )
{
    LARGE_INTEGER    Frequency;
    int                i;
    double            Value;
    DWORD            List[LIST_MAX];
    LARGE_INTEGER    PerformanceCount;

    QueryPerformanceFrequency( &Frequency );
    Value    = ( double )Frequency.QuadPart / 1000.0;
    TimerInitial( );

    for( i = 0 ; i < LIST_MAX ; i++ )
    {
        TimerSleep( WAIT_TIME );

        QueryPerformanceCounter( &PerformanceCount );
        List[i]    = ( DWORD )( PerformanceCount.QuadPart / Value );
    }

    TimerRelease( );
    for( i = 0 ; i < LIST_MAX - 1 ; i++ )
        printf( "%4d\n", List[i + 1] - List[i] );
}

一応、らしく動くのですが…。

一つ大きな落とし穴が…。

それは!!

To Be Continued!

…。

嘘です。

やってみたかっただけです…。

実は…

「TimerSleep」の中身に問題が…。

メインの処理が重くなった時に…
たまたま…
「TimerWait」に1をセットした直後に
「TimerProc」が割り込むと
処理が破綻しちゃいます…。

「TimerWait」をセットした直後にタイマースレッドを
立ち上げるのも考えたんですが…。
(※あんまりお勧めできない方法ですが…。)

処理の設定のためか最初の400回ぐらいは、
ノーウエイトで実行されてしまいます…。
と言うことで、タイミングが安定しません。

それもこれも、「TimerWait」に1を
設定するのが問題なのです!
つまり「TimerWait」に「2」以上を
セットすればOKなのです!

と言う訳でセーフティを付けて解決!

…と言うことにしよう!

では、お休みなさい…。

| | コメント (0) | トラックバック (0)

自民大躍進!

自民は、予想通り…ではなく、
上回って躍進してしまった…。

それほど改革を期待している
国民が多いのを表していると思う。

岡田代表は、予想通り辞任。

自民党には、さらに改革を進めて欲しい。

せめて改革途中のものは、改革を終わらせて欲しい。

道路公団なんかガツンとやってくれ!

ねえ?

| | コメント (0) | トラックバック (0)

2005年9月 6日 (火)

誤りは正さねば!「Sleep」は、良い精度…

まず最初に…

~ごめんなさぁい!

…。

うそ書いちゃいました~。

…。

ボケていましたぁ~。

…。

本当です。

…。

実は、「Sleep」の精度にケかましました…

>でも、2Kだといい感じに動いてくれない…。
と書いてしまった件です…。

…。

と言う訳で、
今回は「Sleep」の精度についてです!
(パフパフ!)

#pragma comment( lib, "WinMm.lib" )
//--------------------------------------
#include    <Windows.h>
#include    <StdIo.h>
//--------------------------------------
#define        LIST_MAX        101
//--------------------------------------
void Function( void )
{
    DWORD            List[LIST_MAX];
    int                i;
    double            Value;
    LARGE_INTEGER    Frequency;
    LARGE_INTEGER    PerformanceCount;

    QueryPerformanceFrequency( &Frequency );
    Value    = ( double )Frequency.QuadPart / 1000.0;

    for( i = 0 ; i < LIST_MAX ; i++ )
    {
        Sleep( 1 );

        QueryPerformanceCounter( &PerformanceCount );
        List[i]    = ( DWORD )( PerformanceCount.QuadPart / Value );
    }

    for( i = 0 ; i < LIST_MAX - 1 ; i++ )
        printf( "%4d\n", List[i + 1] - List[i] );
}
//--------------------------------------
void main( void )
{
    printf( "Test 1 ----------------------\n" );
    Function( );

    printf( "Test 2 ----------------------\n" );
    timeBeginPeriod( 1 );
    Function( );
    timeEndPeriod( 1 );
}

9Xだと…。

Test 1 ----------------------
   3
   ~
Test 2 ----------------------
   1
   ~
上は、3で、±1の誤差が2~30回に1回でる程度。
下は,1で、+1の誤差が2~30回に1回でる程度。

2Kだと…。

Test 1 ----------------------
  10
   ~
Test 2 ----------------------
   1
   ~

上は、10で、±1の誤差が2~30回に1回でる程度。
下は,1で、+1の誤差が4~50回に1回でる程度。

でした…。

結局「timeBeginPeriod」で
「Sleep」の精度は、
上がったのです。

ちょいとボケて見落としていました…。<寝ていました…。

なぜ気が付いたかと言うと…。

それは、それ。
これは、これ。

で気が付きました。

『間違いは、正さねば!』

と天の声が聞こえたのも確か!

電波かもしれんが…。

取り合えず

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 );
}

は、それなりに使えそうです…。

でわ…。

| | コメント (0) | トラックバック (0)

« 2005年8月 | トップページ | 2005年10月 »