////////////////////////////////////////////////////////////////////
/*

    KAB-studio.h


    (C)KAB-studio 1999 - 2004 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz

    送信日： 2004/10/11(Mon) No.277
    配信数： 2036
    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
*/
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
/*                ２００４年１０月１１日（月）の更新              */
http://www.kab-studio.biz/index.html

・ほとはーお休み……
　ごめんなさい、三人合体ホットハーブはお休みです……来週は必ず。


////////////////////////////////////////////////////////////////////
/*                        ちょお普通な日記                        */
http://www.kab-studio.biz/nikki2/index.html

2004/10/03 (Sun)
　だらだらMachician書いて４時寝。のんびり。ほとはー外伝２は無理です。
Machician４コマとかに差し替える予定。火山高、絵が格好いい。明日から
また仕事……。そして眼鏡と金とテレビ。

2004/10/04 (Mon)
　９時半からの新勤務地。計算系のチェック。仕事場にはもう慣れた。お昼
をどうするか。一人で食べたい。疲労感ないです。ほとはー外伝３の前編を
書こうかな。

2004/10/05 (Tue)
　バグふたつ潰す。業務はわからないけどだいたい感じわかってきた。帰る
と疲れが出てくる……。そしてお昼。一人で食べる時間が大事。そして
適材適所？

2004/10/06 (Wed)
　バグみっつ潰す。ストアドプロシージャを探す。酷い中身……。なんか
疲れた。新番組色々。そして読みとこだわり。

2004/10/07 (Thu)
　JCOM がうまくいかないんであんま仕事できなかった。だからかあまり疲
れてない。新番組はいいのと悪いのとが……。そして仕様とか。そして
あぶく銭の歌。そしてネコミミのアレは歌？

2004/10/08 (Fri)
　バグ探し。計算が合わないのとソート順と帳票のと。文字化け問題はなぜ
必ず起きるのか。らくえんサントラ。精神的には大丈夫だけど疲れた。しか
も明日休出。

2004/10/09 (Sat)
　９時半から休出。バグ４つ潰す。６時半に上がるも電車は止まって
タクシーで。まんがタイムきららを買ってぐだーっと。新勤務地、１週間の
感想。

////////////////////////////////////////////////////////////////////
/*                         風雅、舞い                             */
http://www.kab-studio.biz/Novel/Fuga/index.html

■　第十一章　ファインダウト社　−４−

「……あのー」
　次の日の朝。
　結白家の玄関を開けた少年は、おどおどする恭子と俊雄の間でとっくみあ
いの喧嘩をする母子に微妙に戸惑った。
「何！？　今取り込み中なの！」
「だからここは危ないって言ってんでしょ！！」
「だからって泉放っておくなんてできないでしょ！！」
「いいじゃん泉くらい！！」
「駄目よ駄目よ絶対駄目！！　ここはあんたのおばあちゃんの、そのおばあ
ちゃんのおばあちゃんの頃からずっとずっと守ってきた所なんだから、絶対
に離れないからね！」
「お母さんがいたって何にもなんないでしょ！！」
「そんなことないもの、私だって術のひとつやふたつ使えるし、結界だって
張ったし」
「それ、無意味だったよ」
　ほんの少し「意」を含んだ言葉に、舞と美咲は反応した。一秒前の状況は
完全にキャンセルされ、ふたりは少年に注意を向け構えを取る。
「あ、少年……」
「おはようございます。今日はリシュネの代わりとして、舞さんのお迎えに
参りました」
「迎え？」
　確かに、ファインダウト社というものがどこにあるか知らない舞は、迎え
が来なければ行きようがなかった。
「あ、君に訊いていいのかわからないけど、あと３人追加していい？」
「舞！！」
「大丈夫です。左さんはそういうことは気にしません」
　と、少年は分かり切ったことのように言い切った。
「じゃあ、３０分待って、準備するから」
「駄目だって、聞いてるの！？」
「そういえば君、ＡＰなんだよね。何キロまで持てる？」
「正確な値はわかりませんが、この前の体力測定ではトラックを持ち上げら
れました」
「ならお母さんひとつくらい大丈夫よね」
「……へ？」
　美咲の顔はみるみる青ざめていった。
                                                              (続く)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]

　彼女は、顔を赤らめて、こう言った。
「私と……私と、付き合ってみない？」


第１話 空から王子が降ってきた 好評連載中！
[ Machician ]
http://d.hatena.ne.jp/kab_studio/20040823#1093276416
[ Machician＋設定 最新一覧 ]
http://d.hatena.ne.jp/kab_studio/searchdiary?word=*%5BMachician
_______________________________________________________________[KCM]

////////////////////////////////////////////////////////////////////
/*                       #pragma twice                            */
http://www.kab-studio.biz/Programing/PragmaTwice/index.html

　Version 14.10
タイマーを使おう！

「同期オブジェクト３つめはタイマーです」

タイマー （ Waitable timer ）

「タイマーも仕組みそのものは難しくありません」
『バトンとかそんな感じ？』
「そういうこと。同じように走ることを例に取ると」

・一定時間毎に走り出す

「のがタイマーかな」
『？』
「選手Ａ、Ｂ、Ｃがいる時に、まずＡが走って、その１分後にＢが走って、
そのさらに１分後にＣが走る」
『ハンデみたいな感じ？』
「そんな感じ。まずはいつも通り、プログラムを見てもらおうか」

namespace B1
{

HANDLE g_hTimer = NULL;
const char *const TIMER_NAME= "ProcessesTimer";

// タイマーを作成します。
void Create()
{
    g_hTimer = CreateWaitableTimer( NULL, FALSE, TIMER_NAME );
    TRACE( "%x\n", g_hTimer );
}

// タイマーを取得します。
void Open()
{
    g_hTimer = OpenWaitableTimer( TIMER_ALL_ACCESS, FALSE, TIMER_NAME );
    TRACE( "%x\n", g_hTimer );
}

// タイマーをセットします。
void Set()
{
    // タイマーを開始するまでの１００ナノ秒数。
    const int DUE_NSEC = -5 * 1000 * 1000 * 10;
    LARGE_INTEGER largeInteger;
    largeInteger.QuadPart = DUE_NSEC;
    // タイマーの間隔のミリ秒数。
    const int INTERVAL_MSEC = 15000;
    BOOL b 
        = SetWaitableTimer
            ( g_hTimer
            , &largeInteger
            , INTERVAL_MSEC
            , NULL
            , NULL
            , FALSE
            );
    TRACE( "%d\n", b );
}

// タイマーを監視して待機状態に入ります。
void Wait()
{
    TRACE( "待機開始。\n" );
    DWORD dwResult = WaitForSingleObject( g_hTimer, 120000 );

    if( dwResult == WAIT_TIMEOUT )
    {
        TRACE( "タイムアウト。\n" );
    }
    else
    {
        TRACE( "待機終了。\n" );
    }
}

// タイマーをキャンセルします。
void Cancel()
{
    LONG lCount = 0;
    BOOL b = CancelWaitableTimer( g_hTimer );
    TRACE( "%d\n", b );
}

// タイマーを削除します。
void Close()
{
    CloseHandle( g_hTimer );
}

}

「前回と関数の数と名前が違うから注意して」
『 Set() が追加されて…… Release() が Cancel() になってる？』
「そうです。このあたりはタイマーが他の同期オブジェクトと違う点かな。
じゃあ、ひとつずつ見ていこうか」

HANDLE g_hTimer = NULL;
const char *const TIMER_NAME= "ProcessesTimer";

『これはいつもと同じ、ハンドルと名前ね』
「この辺はどの同期オブジェクトも同じだから。次も同じ」

// タイマーを作成します。
void Create()
{
    g_hTimer = CreateWaitableTimer( NULL, FALSE, TIMER_NAME );
    TRACE( "%x\n", g_hTimer );
}

「これはタイマーを作る関数。引数も他と同じ」
『じゃ、次』

// タイマーを取得します。
void Open()
{
    g_hTimer = OpenWaitableTimer( TIMER_ALL_ACCESS, FALSE, TIMER_NAME );
    TRACE( "%x\n", g_hTimer );
}

「これも同じ、元々作ってあるタイマーを取得します」
『 TIMER_NAME と同じ名前のタイマーを取得するんだね』
「そういうこと。では次、これはちょっとややこしいです」
『追加された関数だね』

// タイマーをセットします。
void Set()
{
    // タイマーを開始するまでの１００ナノ秒数。
    const int DUE_NSEC = -5 * 1000 * 1000 * 10;
    LARGE_INTEGER largeInteger;
    largeInteger.QuadPart = DUE_NSEC;
    // タイマーの間隔のミリ秒数。
    const int INTERVAL_MSEC = 15000;
    BOOL b 
        = SetWaitableTimer
            ( g_hTimer
            , &largeInteger
            , INTERVAL_MSEC
            , NULL
            , NULL
            , FALSE
            );
    TRACE( "%d\n", b );
}

「この関数は、タイマーを実際にセットします」
『時間セットしてオンにする、みたいな？』
「そういうこと。 OpenWaitableTimer() は作るだけだから、この 
SetWaitableTimer() でセットしなきゃいけないんです」
『でも数字多くてよくわかんない……』
「使う数はふたつ。まずひとつめは、タイマーが一番最初にオンになるまで
の時間」

    // タイマーを開始するまでの１００ナノ秒数。
    const int DUE_NSEC = -5 * 1000 * 1000 * 10;

『ナノ秒……？』
「１秒の１０００分の１がミリ秒、ミリ秒の１０００分の１がマイクロ秒、
マイクロ秒の１０００分の１がナノ秒。あ、この単位は１００ナノ秒だか
ら、マイクロ秒の１０分の１が１００ナノ秒」
『すごく小さな数……』
「でもナノって数はあまり気にしなくていいかも。この例では 5 だから
５秒後ってこと」
『ん？　マイナス付いてるけど』
「実はこの第２引数にはふたつの使い道があるんです」

・正の数：1601/01/01 00:00:00 からののべ時間
・負の数：呼び出した瞬間からののべ秒

「つまり、正の時間を使えば〈２００４年１月１日０時０分０秒から〉とい
うふうにきっちりとした時間からタイマーを開始できるんです」
『そっちはタイマーっていうよりアラームだね』
「どっちの場合でも、 LARGE_INTEGER っていう構造体に入れて渡します」

    LARGE_INTEGER largeInteger;
    largeInteger.QuadPart = DUE_NSEC;

「この構造体は 64 ビットサイズの整数値を入れられます」
『 64 ビットっていうと…… int が 32 ビットだからその倍だね』
「 int の最大値より、 2 の 32 乗大きい数を入れられるってことだから」
『うわすご！』
「１００ナノ秒だし、正の数の時には大きな数になるからね……で、今のが
スタートするまでの時間。次はタイマーの間隔」

    // タイマーの間隔のミリ秒数。
    const int INTERVAL_MSEC = 15000;

「タイマーは一定時間毎にオンになるから、その間隔」
『これはミリ秒数だから……１５秒間隔だよね』
「そう。この例だと１５秒間隔でオンになります。このタイマーは、この関
数で止めます」

// タイマーをキャンセルします。
void Cancel()
{
    LONG lCount = 0;
    BOOL b = CancelWaitableTimer( g_hTimer );
    TRACE( "%d\n", b );
}

『これで止めるまで止まらない？』
「そういうこと。というわけで次回は実際に使ってみます」

/*
    Preview Next Story!
*/
『タイマーって、ネットで調べてもあまり例ないよね』
「ちょっと使い方が難しいっていうのもあるけど……
『けど？』
「一番の理由は、使い道がないことかな」
『使い道ないの？』
「というわけで次回」
＜ Version 14.11 タイマーを使ってみる！ ＞
『につづく！』
「ないっていうか、はっきりしないって言うか……」
『おまえがはっきりしろ』


////////////////////////////////////////////////////////////////////
/*                ２００４年１０月１８日（月）の更新              */
http://www.kab-studio.biz/index.html

・ほとはーに１話追加
　三人合体ホットハーブに一話追加します。


////////////////////////////////////////////////////////////////////
/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.biz/nikki2/
・購読登録を解除したいときにはこのページで行なってください。
http://www.mag2.com/m/0000012198.htm
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://backno.mag2.com/reader/Back?id=0000012198
http://www.kab-studio.biz/Freeware/index.html#MailMagazine


////////////////////////////////////////////////////////////////////
/*
    KAB-studio.h
      Weekly Mail Magazine.
      Written by Kaburaya Seiden.
      http://www.kab-studio.biz/Info/MailMagazine/

    (C)KAB-studio 1999 - 2004 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz
*/
////////////////////////////////////////////////////////////////////

