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

    KAB-studio.h


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

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

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

・KAB-studio.h 縮刷版更新
　KAB-studio.h が２８０号に達したので縮刷版を更新しました。
ダウンロードはダウンロードルームにて。
[ ダウンロードルーム ]
http://www.kab-studio.biz/Freeware/index.html#MailMagazine

・ほとはーお休み……
　なんかもう隔週更新できればマシなレベルに……。


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

2004/11/07 (Sun)
　Intuos3 PTZ-930 が届くもマットのオーバーレイシートが入ってな
い……。バルドフォースエグゼ、彩音エンド。 Intuos3 で線が滑らかに。
ほとはー描いてひーこら。そして人を使う。そしてＯＢ会。

2004/11/08 (Mon)
　派遣先Ｃ社の新社屋に。すごいとこだ……。午後に次のプロジェクトの
勤務地へ。マニュアルなしでこつこつと。そしてフリー。そしてＯＢ会。

2004/11/09 (Tue)
　現プロジェクト本格始動。カスタマイズしてがりがり作業。食堂。今週中
は無理目。週報とか頼むなー。そしてＯＢ会の予定。そして金。

2004/11/10 (Wed)
　仲介クラス４つ。ダウンロードと Entity Bean のデータベース更新も可
能に。食堂低カロリーセット。冬コミ落ちた……。巌窟王がえらい気合い
入ってる。そして週報。そして食堂。

2004/11/11 (Thu)
　Entity Bean を使ったデータベースアクセス。 EJB のデプロイでえらい
手間取った……。最近食べまくり。そしてマンション経営。つか！

2004/11/12 (Fri)
　金曜って感じがしない……。サーバーへのデプロイに成功。共通部品を
がりがりコーディング。明日は部品じゃできないとこを。今週中に終わると
は思ってなかった（爆）。明日完成、月曜にちょこっと残りを？　忘年会も
どきは出ず……。舞-HIME って女の子向け？

2004/11/13 (Sat)
　平日のように休出。大きいのを最後に持ってきたのは失敗だった。えらい
時間が……仕様も固まってないし……。業務機能なんとか完成。明日はお休
み。今週は異常だった……。


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

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

「そういえば」
　４人は舞の部屋に集まっていた。
「お父さんとお兄ちゃんはどうするの？」
「仕事も大学もあるから家にいるって。私も時々向こうに行くから」
「時々？」
「時々くらいでいいでしょ。私としては、ここで調べてみたいこともある
し」
　それに……まだ、あの家は自分の家ではない気がした。
「恭子と木村君はどうする？　ここから学校行く？　家に戻る？」
「うーん……」
　現実的に、親を説得してここに居続けることは不可能だ、と思う。
　でも。
　今ここで離れたら、これから先、もう舞には会えない気がした。
「舞さんは学校どうするの？」
　俊雄の問いにも。
「行かないつもりだけど」
「……この子は……」
「さっきいた三井さんって人が勉強教えてくれるっていうし。キョージュら
しいよ」
「そういう問題じゃないでしょ。出席日数とか」
「もう何ヶ月も前になるけど」
　まだ、あのときの吠え声がよみがえる。
「学校にいたときに教われたこと、あったじゃない」
「あ……」
　何発も水槍を放った。
　ただひたすら駆けた。
「ああいうの、もうやなんだ」
　今にも泣きそうな笑顔。
「ホントはね、ふたりにも、お母さんにも、お父さんもお兄ちゃんも、朱き
泉の人たちも、みんなみんなここにかくまって欲しい……怖いの、本当
に……」
　その手は、震えていた。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[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.15
スレッドを使ってみる！

「今回は、前回紹介したスレッドの使い方について説明します」
『そうそう、なんかよくわかんなかったんだよねー』
「スレッドだけじゃなく、たとえば同期オブジェクトもそうなんだけど、情
報として与えられているのは〈道具としての使い方〉だけだから。使うため
には、どういうことに使えるのか把握していないと」
『つまり、ミューテックスがバトンとして使える、っていうことを理解しな
きゃダメ、みたいな？』
「そういうこと。具体例として使い方がわからなきゃね」
『なるほど』
「というわけで実際に見ていきましょう。まず、説明を始める前に Sleep() 
という API を紹介します」
『寝る、ってこと？』
「そう。この関数を呼ぶと一定時間止まります」

void UseSleep()
{
    TRACE( "5 秒止まります。\n" );
    Sleep( 5 * 1000 );
    TRACE( "5 秒止まりました。\n" );
}

5 秒止まります。
（ 5 秒経過... ）
5 秒止まりました。

『ホントだ、５秒止まった！』
「 Sleep() の第１引数は待つ時間で単位はミリ秒。今回は 5000 だから 5 
秒」
『で、これが？』
「この Sleep() は、この関数を呼び出したスレッドだけを止めるという機
能があります」
『呼び出したスレッドだけ……？』
「そこで、この関数を使ってスレッドを止めてみます。前回の例をちょっと
改造して」

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

// スレッドを作って呼び出す関数。
void UseThread()
{
    _beginthread( ThreadFunction, 0, NULL );
    TRACE( "スレッド呼んだよ。\n" );
    TRACE( "5 秒止まります。\n" );
    Sleep( 5 * 1000 );
    TRACE( "5 秒止まりました。\n" );
    TRACE( "関数終了します。\n" );
}    

『なんか TRACE() ばっか……』
「ごちゃごちゃしてわかりにくいけど」

ThreadFunction() （スレッド側） ：３秒待つ
UseThread() （呼び出す側）      ：５秒待つ

「ってこと」
『普通に考えると、スレッドの方が先に終わって、呼び出す側が後に終わる
よね』
「当然そう」

スレッド呼んだよ。
5 秒止まります。
スレッドです。
3 秒止まります。
3 秒止まりました。
スレッド終了します。
スレッド 0x1E0 終了、終了コード 0 (0x0)。
5 秒止まりました。
関数終了します。

「まず呼び出す側が止まり始めて、そのあとスレッドが止まり始めて、３秒
経つとスレッドが止まり終わってそのまま終了、最後に呼び出す側も５秒
経って終了、ということ」
『やっぱなんかそのままじゃん』
「んー……そっか、じゃあこれを試してみて」

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

// スレッドを作って呼び出す関数。
void UseThread()
{
    // _beginthread( ThreadFunction, 0, NULL );
    ThreadFunction( NULL );
    TRACE( "スレッド呼んだよ。\n" );
    TRACE( "5 秒止まります。\n" );
    Sleep( 5 * 1000 );
    TRACE( "5 秒止まりました。\n" );
    TRACE( "関数終了します。\n" );
}

『？』
「 ThreadFunction() を、スレッドとしてじゃなく、普通に呼んでみた場合
ってこと」
『あ、なるほど』

スレッドです。
3 秒止まります。
3 秒止まりました。
スレッド終了します。
スレッド呼んだよ。
5 秒止まります。
5 秒止まりました。
関数終了します。

『 ThreadFunction() で３秒止まって、呼び出す側で５秒止まって……そっ
か、スレッドでやった時って、スレッドの方も呼び出した側も一緒に止まっ
てたけどそうじゃなかったらまず３秒止まって次に５秒止まる、ってなるん
だ』
「そういうこと。図にするとこう」

■スレッドを使わない場合
UseThread()           ThreadFunction()
呼び出し→→→→→→→呼び出されました
                      ３秒待機
                      （待機中……）
                      待機終了
戻ってきました←←←←関数終了
５秒待機
（待機中……）
待機終了

■スレッドを使う場合場合
UseThread()           ThreadFunction()
呼び出し→→→→→→→別スレッドで開始
５秒待機              ３秒待機
（待機中……）        （待機中……）
（待機中……）        （待機中……）
（待機中……）        （待機中……）
（待機中……）        待機終了
（待機中……）        関数終了
（待機中……）
待機終了

『スレッドの時は並行処理……それがこういうふうに動くってことなのね』
「まぁ、難しいこと考えないで、プロセスがふたつあるようなもの、って考
える方がわかりやすいかも」
『んー……質問！』
「はい火美ちゃん」
『 ThreadFunction() って関数から抜けたらどうなるの？』
「どうもならないよ。スレッドとして呼び出した関数から抜けたら、その
スレッドはそこで終了」
『終わっちゃうんだ。あれ？　 UseThread() の方はどうなっちゃうんだろ
う』
「そっちは、完全に抜けるとアプリが終了します」
『アプリが？』
「 Version 8.01 ( No.143 ) で WinMain() って説明したでしょ」
『うん、一番最初に呼ばれる関数だよね』
「この関数が呼ばれるときも、スレッドが作られるんです」
『え？　WinMain() が呼ばれるときも？』
「スレッドはプログラムの流れ。ってことは、プログラムを実行するときに
は必ずひとつ作られて、そのスレッドの流れに従ってプログラムが実行され
ていくわけです」
『あ！　そっか、スレッドってもう必ず最初は存在してるんだ』
「そういうこと。 WinMain() から始まる処理が、最初に作られる、普段処
理しているスレッド。だから、 WinMain() から抜けるとき、このメインの
スレッドも終了して、アプリが終了するんです」
『ん？　それってさっきの話と続く？』
「そうだよ。 WinMain() から関数が呼ばれまくって UseThread() が呼び出
されるんだから」
『あ……？　ホントに？　なんかそういう感じがしないけど』
「ボタン押すと呼ばれるしね」
『そうそう』
「というかウィンドウ使ってるとそれだけでマルチスレッドっぽいしね」
『そうだよね、それぞれのウィンドウが独立して動いてるように見えるけ
ど』
「でも実際にはスレッドはひとつ、最初に作ったものだけ。だから、ボタン
を押したときの関数も、結局は最初に作られたスレッドで呼ばれるんです」
『ウィンドウプロシージャとか通ってても？』
「そういうこと。これはあとでちゃんと説明するから。これができないと、
たとえば〈何かの処理をする間、ダイアログで進行報告＆キャンセル用ダイ
アログを表示する〉っていう処理が作れません」
『あ、よくあるパターンだよね。作れない、ってことは難しいんだ』
「そういうこと。そういう、画面まわりの処理とマルチスレッドを組み合わ
せて使えるようになれば、マルチスレッドはマスターかな」

/*
    Preview Next Story!
*/
『むむー、スレッドって微妙に使いづらい？』
「というかもっともっと使ってみて」
『っていっても使い方が……』
「使い方は、投げっぱなしが基本」
『投げっぱなし？』
「そ。投げて、自分は別の処理をして、終わったら待つ」
『待つ？』
「というわけで次回」
＜ Version 14.16 スレッドを待ってみる ＞
『につづく！』
「ま、使いまくればわかってくるから」
『なんかそればっか』


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

