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

    KAB-studio.h


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

    送信日： 2005/01/24(Mon) No.291
    配信数： 2021
    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
*/
////////////////////////////////////////////////////////////////////

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

・ほとはー外伝３スタート！
　お待たせしました、ほとはー外伝３のスタートです！
　休止しているほとはーの代わりとして、今度夏コミで頒布する予定の
外伝３を掲載していきます。コマ割りマンガ、白黒、そしてちょっとシリア
スなストーリー……いつもと違うほとはーをお楽しみください。
[ 三人合体ホットハーブ 外伝３ 【ワタシ の キロク】 ]
http://www.kab-studio.biz/Comic/HotHerbA3/index.html


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

2005/01/16 (Sun)
　ほとはー外伝３のコンテと、ホームページの表紙を描く。ハオシャオが
バジルを敵視していた理由、ころっと変わった理由、その他様々な伏線。絵
を描くと眠くなるのは集中するから？　この半月はすごく長く感じた。そし
て朝早く起きる。

2005/01/17 (Mon)
　表紙リニューアル。朝から晩までひぐらしのなく頃に「綿流し編」をして
ました。それほどでもない……？　ＳよりＭ。そして再現性。そして月曜
日。

2005/01/18 (Tue)
　Tomcat で悪戦苦闘。データベースのバックアップの問題。午後は
Machician書き。Machicianが長くなる。ウイイレで空腹を紛らわす。

2005/01/19 (Wed)
　午前中は Struts テスト環境の整備。午後はほとはー外伝３。とにかくが
りがり描くのが合ってるらしい。マット地のオーバーレイシートをさかさま
に使ってた……。ほとはー外伝３は１ページずつ掲載。そしてプロ。

2005/01/20 (Thu)
　休みの日として部屋の片付けとかビデオのダビングとかファイルの整理を
しようとしたら、ファイルの整理しかできず。ハードディスクが壊れてから
のもの。ネギまのゲームを Amazon で注文してしまった。そしてトラフィッ
ク。

2005/01/21 (Fri)
　昨日はシャワー浴びたりして寝れなくて朝７時に起きて病院へ。超音波と
エックス線検査を受ける。エックス線検査でぐるんぐるん回り回される。
７時から９時までうたたね。来週結果聞きます。

2005/01/22 (Sat)
　中途半端な１日。IH調理器は来ず。霜取り開始。午前中は MySQL のテス
トとか。午後はほとはー外伝３描き。霜取りが進まない……。ウイイレで
故障続き。霜取り終わらない。そして退職記念パーティー。


////////////////////////////////////////////////////////////////////
/*                         風雅、舞い                             */
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.24
メッセージループとスレッド

「今回は、前回作ったウィンドウプログラムを元に、スレッドについて見て
いきます」
『それなんだけど、それってどう結びつくのかよく分かんない』
「なぜ結びつくかというと、ウィンドウ、っていうがスレッドと関係してた
りしてなかったりするから」
『？？？　してたりしてなかったり？』
「そう。そういった部分をはっきりするためにも、メッセージループを実際
にプログラムで作ってみて、それを試していきます。まず、さっきから話題
にしているメッセージループについて。これはこの while を指します」

    // メッセージループです。
    while( 1 )
    {
        // メッセージをキューから取り出します。
        bRes = GetMessage( &stMsg, NULL, 0, 0 );
        if    ( 
                ( bRes == 0 )
            || 
                ( bRes == -1 )
            )
        {
            // 終了するのでループから抜けます。
            break;
        }

        // メッセージを変換します。
        TranslateMessage( &stMsg );
        // ウィンドウプロシージャに送ります。
        DispatchMessage( &stMsg );
    }

『これがメッセージループなんだよね、半永久的に回る』
「このメッセージループでは、まずメッセージキューからメッセージを取り
出します」

        // メッセージをキューから取り出します。
        bRes = GetMessage( &stMsg, NULL, 0, 0 );

「メッセージは、たとえばウィンドウがアクティブになったり、キー入力さ
れたり、そういう【イベント】の情報が入ったものを指します。これが第１
引数の stMsg 構造体に格納されます」
『 WM_ なんたらっていうのがメッセージなんだよね』
「そうそう。そういったメッセージは、 DispatchMessage() でウィンドウ
プロシージャに送られます」

        // ウィンドウプロシージャに送ります。
        DispatchMessage( &stMsg );

『これが呼ばれると WndProc() の方にメッセージが送られて、そっちで
メッセージを処理するんだよね』
「そういうこと。そしてまた始めに戻ります」
『メッセージキューからメッセージ取り出すとこね』
「さて、ここで次の場合を考えてみます」

・メッセージがない場合、 GetMessage() はどうなる？

『……どうなるんだろう……メッセージキューにメッセージが貯まってな
いってことだよね。メッセージがないからメッセージが来るまで待つのか
な、それともすぐ返ってきて次のループに行くのかな……』
「というわけで」

        // メッセージをキューから取り出します。
        bRes = GetMessage( &stMsg, NULL, 0, 0 );
        OutputDebugString( "メッセージ来た！\n" );

「ってして、メッセージが来ない場合にどう出力されるのか見てみて」
『ほい。……あ、なんもしないでほっぽっとくと、何も出ない、ってことは 
GetMessage() から返ってきてないんだ』
「そういうこと。 GetMessage() は、メッセージがない場合にはメッセージ
が来るまでずっと待ち続けます」
『おお、けなげ』
「もうひとつ重要なのは、待ってる間、 CPU パワーは全然使わないってこ
と」
『？』
「もしさっき火美ちゃんが言ってたように、 GetMessage() がすぐ返ってき
て、ループが繰り返されてたら、ずーっとまわりっぱなしでしょ」
『メッセージが来ない間も while のなかをぐるぐると……それってずっと
動きっぱなし、それが CPU パワー使っちゃうってこと？』
「そういうこと。でも実際には、 GetMessage() はメッセージが来るまで
ずっと待ち続けて、しかも CPU は使用しないんです」
『何もしてない時はこうやって CPU 使わないわけだ……』
「さて、もうひとつ、こんな場合を考えてみます」

・メッセージがいっぱいある場合、 GetMessage() はどうなる？

『ん？　そんなのわかりきってない？』
「じゃあどうなると思う？」
『え、えーっと……メッセージキューにメッセージがいっぱい入ってても、
まずひとつ取り出して、それをウィンドウプロシージャに渡して処理して、
んで次の周で２番目のを取り出して、それをウィンドウプロシージャに渡し
て……って続くんじゃない？』
「うん、そうなります。プログラムで追っていくと」

        // メッセージをキューから取り出します。
        // 【メッセージ１】【メッセージ２】...（←キューの中身）
        bRes = GetMessage( &stMsg, NULL, 0, 0 );
        // 【メッセージ２】...（←キューの中身）
        // stMsg には【メッセージ１】が入ってます。
// 略
        // ウィンドウプロシージャに送ります。
        // 【メッセージ１】を送ります。
        DispatchMessage( &stMsg );

「これが１周目。２周目には【メッセージ２】が同じように処理されます」
『なんだ、あってんじゃん』
「では、【メッセージ１】の処理内容がすごく重い場合、どうなるでしょ
う」
『え、重い場合？？』
「そう、たとえば【メッセージ１】が WM_ACTIVATE だった場合、その際の
再描画ですごく大きな画像を出力しなきゃいけないときとか」
『それだと、ウィンドウプロシージャで止まってることになるよね……む、
そういうときって DispatchMessage() って返ってくるのかな、それとも
ウィンドウプロシージャでの処理が終わるまで返ってこないのかな』
「返ってきません。ウィンドウプロシージャでの処理が終わらないとね」
『ってことは、その重い処理が終わらない限りループは２周目に行かない、
メッセージ２は処理されない……』
「ってことになります。これがいわゆる〈固まった〉状態」
『あ、なるほど、ウィンドウがうんともすんとも言わなくなっちゃうのは、
こうやってメッセージひとつ止まっちゃうと、次のメッセージとかも全部止
まっちゃうからなんだ』
「そうなんです。さて、今火美ちゃんが悩んだところに、実はすごく大きな
ことが含まれているんです」
『え、そうなの？』
「今、火美ちゃんは〈DispatchMessage() って返ってくるのかな〉って言っ
たけど、もし返ってくるとしたら、メッセージループとウィンドウプロシー
ジャはどうなる？」
『どうなるって、もし DispatchMessage() が呼ぶとすぐ返ってくるとする
と、メッセージループはすぐ次のループになって、ウィンドウプロシージャ
では同時に送られてきたメッセージを処理する……あ”！！』
「そう、それって」
『マルチスレッド！！』
「そういうこと。火美ちゃんが言った状態は、マルチスレッドを指してるん
です」
『はー、そういうことなんだ』
「そして、火美ちゃんが言ったような状態に自動的にはなりません。つま
り、勝手にマルチスレッドになったりはしないんです」
『あの関数とか API 呼ばない限り、スレッドはひとつだけってこと？』
「そういうこと。だから」

        // ウィンドウプロシージャに送ります。
        DispatchMessage( &stMsg );

「でメッセージを送ると、スレッドの〈進行〉はウィンドウプロシージャに
飛びます」

// ウィンドウプロシージャ。
LRESULT CALLBACK WndProc
    ( HWND p_hWnd
    , UINT p_uiMessage
    , WPARAM p_wParam
    , LPARAM p_lParam
    )
{
    // この中でスレッドが進行します。
}

「関数を呼び出したりした時に、メインのスレッドとは別のスレッドが勝手
に処理してくれる、なんてことはないんです。メッセージループを処理して
いるスレッドも、ウィンドウプロシージャを処理しているスレッドも、同じ
ひとつのスレッドなんです」
『同じスレッド……』
「ここがとても重要なんです。メッセージループやウィンドウプロシージャ
が関わってくると、プログラムの流れ、スレッドの進行が無視されがちなん
だけど、実際にはシンプルな話。一見マルチスレッドしてそうでも、実はし
てないんです」
『確かに、ウィンドウの操作とか、ぱっと見マルチスレッドっぽい感じする
もん。でも違うってことね。そうでなきゃ固まらない、と』
「さらに話を進めると、メインのスレッドは最初から最後までちゃんと継な
がってるんです」
『？　どゆこと？』
「プログラムはどこから始まる？」
『 WinMain() 』

// 最初に呼ばれる関数です。
int WINAPI WinMain
    ( HINSTANCE p_hInstance
    , HINSTANCE p_hPrevInstance
    , LPSTR p_pchCmdLine
    , int p_iCmdShow
    )
{
    // プログラムはここから始まる。
// 略
    return MessageLoop();
}

「 WinMain() から始まったプログラムの流れ、つまりメインスレッドの
進行は、メッセージループに入ります」

    // メッセージループです。
    while( 1 )
    {
        // メッセージをキューから取り出します。
        bRes = GetMessage( &stMsg, NULL, 0, 0 );
// 略
        // ウィンドウプロシージャに送ります。
        DispatchMessage( &stMsg );
    }

「この中でもメインスレッドがループしてます。 GetMessage() にメッセー
ジがなければスレッドは停止してるし、 DispatchMessage() の先ではウィ
ンドウプロシージャまでメインスレッドが行って処理します。そして、終了
する時にはメッセージループから抜けて、 WinMain() からも抜けて、アプ
リケーションが終了します」
『……全部継ながってるってこと？』
「というわけで次回に続く！」

/*
    Preview Next Story!
*/
『固まるってこういうことだったのね……』
「まぁアプリ毎に違うけど、基本的にはこういうこと」
『固まるアプリって最低よねー』
「だから、自分が作るアプリはそういうことがないようにしないと」
『……それはそれでめんどくさい』
「というわけで次回」
＜ Version 14.25 ２種類のマルチスレッド ＞
『につづく！』
「マルチスレッドがちゃんとわかれば固まらなくなるから」
『だからめんどくさいって』


////////////////////////////////////////////////////////////////////
/*                ２００５年１月３１日（月）の更新                */
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 - 2005 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz
*/
////////////////////////////////////////////////////////////////////

