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

    KAB-studio.h


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

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

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

・ほとはー９の１１追加！
　三人合体ホットハーブに「９の１１ 確かに良くなった」を追加！
[ 三人合体ホットハーブ ]
http://www.kab-studio.biz/Comic/HotHerb/index.html


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

2004/11/14 (Sun)
　まず Intuos3 のマットオーバーレイシートを受け取って、午後はずっと
ひぐらしのなく頃にを。夜はMachicianを書いて以上。そしてプロポーズで
すか。

2004/11/15 (Mon)
　朝から晩までコーディング。大がかりな仕様変更……。明日いっぱいで本
当のプロジェクトに移る予定。派遣先Ｃ社からヘッドハンティングされるも
やや微妙？　とりあえず断る予定。そして本当に辞めるのか。

2004/11/16 (Tue)
　午前中はちょこちょこバグ潰し＆ドキュメント書き。のんびりなのに１１
時半上がり。そしてあまり上がりません。

2004/11/17 (Wed)
　午前中はこれまでのプロジェクト、午後から本当のプロジェクト……なん
だけど、仕事の内容がいまいちわからん。しかも仕事しづらいし……。夕方
に派遣元Ａ社の人とお話。そろそろ就職活動するか……。そして労働収入。

2004/11/18 (Thu)
　１０階プロジェクトと１７階プロジェクト。１７階プロジェクトでこつこ
つデータベース仕様書修正。午後は１０階プロジェクトのトラブル解決に。
舞-HIMEがいい感じだ……。そしてのろけなのか愚痴なのか。

2004/11/19 (Fri)
　意識が１５度左にずれる。そんなヤバい状態でがりがりプログラム修正。
明日あさってお休みします。ヘッドハンティングのを断るもしつこく……。

2004/11/20 (Sat)
　午前中は洗濯とか、午後はバルドフォースエグゼを３シナリオ一気に。
伏線の持っていき方がうまい……。そしてＯＢ会行きませんでした。


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

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

「じゃあ、下から順に見てもらいます」
　エレベーターの中、４人は智子について地下へと降りていく。
「ここからは完全な機密事項ですから」
「わかってます」
　答えたのは舞だけだった。
　エレベーターから降り通路を抜けると、そこはオペレータールームだっ
た。モニター、キーボード、机、椅子のセットが２０以上並んでいる。
　奥の壁は全面ガラス張りになっていて、見下ろすとめまいがした。
「高い……」
　高いというのか、その下にある空間が広大すぎるのか。白く広大な空間が
眼下に広がっている。
「誰かいる」
　空間の床には赤いコーンが置かれていて、その間を駆ける姿があった。あ
まりにも早く、その表情はよく見えないが、背格好から以前沼地で戦った相
手だと判る。
「速……舞はあんなふうに走れるの？」
「あのねぇ……私は一応普通の人間なんだから、あんなことできないの」
　でも、と、無意識のうちに右手が動く。
　捉えることは、簡単。
「ここはトレーニングスペースを兼ねたテスト用の施設です。彼のように
ＡＰの能力を数値化して記録するのが主な目的です」
「それは、まだＡＰというのが発展途上の技術ということですか？」
「発展する余地のない技術なんてありません。では、次へ行きましょう」
　智子はエレベーターへと向かう。
　……うすうす気付いてはいたが、結白の血はこの人と相性が悪いらしい。
「次は１０階の社員食堂」
　コースの順番がなんかめちゃくちゃな気がするが、でも非常に重要なポイ
ントだった。
　１０階に降りるとすぐ目に入る入り口、その脇に置かれたテーブルとサン
プル。
「皆さんは宿泊ゲストですので、そのIDカードがあれば食事は無料です」
「無料！？」
「……チェックアウトするときに支払うってこと？」
「無料、です」
　智子はぴしゃりと言い切った。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『朱雀の力を威として、目の前の箱を吹き飛ばせ！』
「！」
「きゃっ！！」
その一文が再生されると、強い風が瞬き、段ボール箱は高々と吹き飛んだ。

Machician 第３話 好きとスキと 好評連載中！
[ 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.16
スレッドを待ってみる

「スレッドの使い方にはいくつかパターンがあります。今回はそのひとつ、
スレッドが終わるまで待つというのをしてみます」
『スレッドが終わるまで待つ……んじゃ、スレッドを使う意味がないよう
な……』
「それはそうなんだけどね、これから複雑な処理をするための準備ってこと
で」
『う、複雑なのがあるんだ……』
「ただ、普通に待つだけなら簡単にできるよ」

// 別スレッドで呼び出される関数。
void __cdecl ThreadFunction( void *p_p )
{
    TRACE( "スレッドです。\n" );
    TRACE( "10 秒止まります。\n" );
    Sleep( 10 * 1000 );
    TRACE( "10 秒止まりました。\n" );
    TRACE( "スレッド終了します。\n" );
}

// スレッドを作って呼び出して待つ関数。
void WaitThread()
{
    HANDLE hThread 
        = (HANDLE)_beginthread( ThreadFunction, 0, NULL );

    TRACE( "待機開始。\n" );
    DWORD dwResult = WaitForSingleObject( hThread, 100 * 1000 );

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

『あ！　WaitForSingleObject() だ！』
「そう、同期オブジェクトを待つときに使った API です。詳しくは 
Version 14.05 ( No.272 ) を参照」
『スレッドも同じように待てるの？』
「そう。まず、 _beginthread() の戻り値は、ミューテックスやセマフォと
同じ【ハンドル】なんです」
『そういえばミューテックスとかもハンドル取得してそれ使ってたね』
「このハンドルも、同期オブジェクトと同じようにシグナルが変わります」

・スレッド実行中：シグナルオフ
・スレッド終了　：シグナルオン

『なるほど、スレッドのハンドルを待てば、スレッドが終わるまで待ってい
て、終わったら待機終了、ってわけね』
「そう、こんな感じに」

待機開始。
スレッドです。
10 秒止まります。
10 秒止まりました。
スレッド終了します。
スレッド 0x798 終了、終了コード 0 (0x0)。
待機終了。

「 WaitForSingleObject() は他の同期オブジェクトと同じようにスレッド
を待ちます。そして、スレッドは終了するとシグナルがオンになります」
『なんかホントに同期オブジェクトみたい……あ、そういえば』

スレッド 0x1E0 終了、終了コード 0 (0x0)。

『って？』
「これはスレッド終了時のメッセージ。これはスレッドが終了したのを VC 
が検知して勝手に出力してるものだから、気にしなくていいかな」
『むー、気にしないってゆーのもアレね……』
「さて、この方法は普通には使いません」
『そなの？』
「最初のスレッドが、立ち上げたスレッドが終わるの待ってたら、ただの
シングルスレッドでしょ」
『そか、それじゃスレッド立ち上げる意味ないね』
「だから、するとしたら間にもうひとつスレッドを挟みます」
『へ？』

// 別スレッドで呼び出される関数。
void __cdecl ThreadFunction( void *p_p )
{
    TRACE( "スレッドです。\n" );
    TRACE( "10 秒止まります。\n" );
    Sleep( 10 * 1000 );
    TRACE( "10 秒止まりました。\n" );
    TRACE( "スレッド終了します。\n" );
}

// スレッドを作って呼び出して待つ関数。
// ただし、この関数も別スレッドとして呼び出されます。
void __cdecl WaitThread( void *p_p )
{
    HANDLE hThread 
        = (HANDLE)_beginthread( ThreadFunction, 0, NULL );

    TRACE( "待機開始。\n" );
    DWORD dwResult = WaitForSingleObject( hThread, 100 * 1000 );

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

// WaitThread() を別スレッドとして呼び出す関数。
// この関数をボタンのイベントハンドラとかで呼んでください。
void CallThread()
{
    TRACE( "WaitThread() 呼び出し。\n" );
    _beginthread( WaitThread, 0, NULL );
    TRACE( "WaitThread() 呼び出し完了。\n" );
}

『関数がみっつ……』
「呼び出す順番はこう」

CallThread() ：メインスレッド
     ↓
WaitThread() ：サブスレッド１
     ↓
ThreadFunction() ：サブスレッド２

『間の WaitThread() も別スレッドで呼ぶんだ……』
「これをダイアログアプリで試してみると、ダイアログが自由に動かせるで
しょ」
『あ、ホントだ！　さっきまで固まってたのに』
「これまでの例のように、メインスレッドでスレッドを作ってそれを待って
いると、メインスレッドが止まったままになっちゃうでしょ」
『それが、もうひとつスレッド作れば、大丈夫になる……』
「もう少し実用的な例で考えてみようか」

・サブスレッド２の処理を３つ平行に行う。
・３つの処理が完了したらサブスレッド１で残処理をする。

「という例を考えてみます」
『つまりサブスレッド２３つが終わったらサブスレッド１でなんかす
る……』
「こういう場合、 WaitForMultipleObjects() っていう関数を使います」

// ThreadFunction() は同じ。

// スレッドを作って呼び出して待つ関数。
// ただし、この関数も別スレッドとして呼び出されます。
void __cdecl WaitThread( void *p_p )
{
    // ３つのハンドル。
    HANDLE hThreadAry[3];
    hThreadAry[0]
        = (HANDLE)_beginthread( ThreadFunction, 0, NULL );

    hThreadAry[1]
        = (HANDLE)_beginthread( ThreadFunction, 0, NULL );

    hThreadAry[2]
        = (HANDLE)_beginthread( ThreadFunction, 0, NULL );

    TRACE( "待機開始。\n" );
    DWORD dwResult
        = WaitForMultipleObjects( 3, hThreadAry, TRUE, 100 * 1000 );

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

// CallThread() は同じ。

『 ThreadFunction() を３回呼んで……配列に入れてる？』
「そう、 HANDLE の配列に入れて、それを WaitForMultipleObjects() とい
う API に渡します」
『 WaitForSingleObject() の複数版、ってこと？』
「そういうこと。 WaitForMultipleObjects() の第１引数はハンドルの数、
つまり第２引数の要素数。第２引数は監視対象のハンドルの配列」
『このハンドルを待機するわけね』
「第３引数は、全部待つか、ひとつだけ待つか。 TRUE だと、すべての
ハンドルがシグナルオンになるまで待ちます」
『 FALSE だと？』
「 FALSE だとひとつだけでもシグナルオンになったら待機終了」
『へー』
「実際の流れはこう」

WaitThread() 呼び出し。
WaitThread() 呼び出し完了。
待機開始。
スレッドです。
10 秒止まります。
スレッドです。
10 秒止まります。
スレッドです。
10 秒止まります。
10 秒止まりました。
スレッド終了します。
スレッド 0x7C8 終了、終了コード 0 (0x0)。
10 秒止まりました。
スレッド終了します。
スレッド 0x3A8 終了、終了コード 0 (0x0)。
10 秒止まりました。
スレッド終了します。
スレッド 0x37C 終了、終了コード 0 (0x0)。
待機終了。
スレッド 0x658 終了、終了コード 0 (0x0)。

『ホントだ、サブスレッド２が３つとも終わってからサブスレッド２が待機
終了してる』
「こういう使い方もできるってことで」

/*
    Preview Next Story!
*/
『でもなんかいまいち使い道わからない』
「というわけで次回からさらに具体的な使い方を見ていきます」
『そっちから教えてもらいたかったなー』
「スレッドだとそれは危険だから、基礎からこつこつと」
『えー？』
「というわけで次回」
＜ Version 14.17 スレッドで変数を共有する ＞
『につづく！』
「いや、本当にスレッドは危険なんだよね……」
『何泣いてんの……』


////////////////////////////////////////////////////////////////////
/*                ２００４年１１月００日（月）の更新                */
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
*/
////////////////////////////////////////////////////////////////////

