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

    KAB-studio.h


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

    送信日： 2005/01/31(Mon) No.292
    配信数： 2028
    発行元： まぐまぐ ( 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/23 (Sun)
　昨日は霜取りで朝６時まで起きてて、今日は予定狂った……。IH調理器と
ネギまゲーム版来る。ネギまゲーム１時限目、エロい……。自炊開始。昨日
正式に会社を退職しました。仕事しなくてもまったく違和感ない……。そし
て内視鏡検査。

2005/01/24 (Mon)
　派遣元Ａ社に社員証送って、代わりに「健康保険資格喪失証明書
（退職証明書）」「年金手帳」「雇用保険被保険者証」の３つが届く。
ネギま１時間めは危険だよ……。本格的に自炊開始。そしてネギま。そして
退職おめでとう。そして自由人へ。

2005/01/25 (Tue)
　徹夜してネギま１時間目１周。ファンは絶対やりましょう。午前中は
市役所で国民年金と国民健康保険への移行。ハローワークはあとで。帰った
ら寝て、麻婆豆腐作って。料理が楽しい理由。そして再就職難しい？

2005/01/26 (Wed)
　１１時起き。時間ずれてる……。ワンルームマンションって仕事してない
と引け目感じる。プログラミング……でもあまり意味なく。使わないものを
作るのが失敗。ネギま攻略本出るまで待つ？　明日横浜行ったりヨドバシ行
ったりします。そして今月分の給料は？

2005/01/27 (Thu)
　ヨドバシ川崎店、カレーミュージアム、有隣堂、メロンブックス、
ゲーマーズ、等級ハンズでかなりの量の本を購入。バルドフォースエグゼは
予約せず。今週はダメダメだ……。そして修行。

2005/01/28 (Fri)
　先週の検査の結果……異常なし。精神的なもの？　症状はあるんだけど
なぁ。運良かった？　これから大変だなぁ。そしてマンション。

2005/01/29 (Sat)
　昨日の夜にまんがタイムきららMAX買いに行って午前５時起き。外伝３を
１ページ。筆が重い……。心が壊れた？　そして２３時。


////////////////////////////////////////////////////////////////////
/*                         風雅、舞い                             */
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.25
２種類のマルチスレッド

「まずは前回のまとめから」
『まず、スレッドは勝手には増えなくて、 WinMain() からスタートした
メインスレッドの流れは、そのままメッセージループやウィンドウプロ
シージャも通って、最後には WinMain() からも抜けて終了、だよね』
「そういうこと。無理矢理入れ子で書くと、プログラム的にはこういう形に
なっています」

WinMain()
{
    MessageLoop()
    {
        while( 1 )
        {
            GetMessage();

            DispatchMessage() → WndProc()
            {

            }
        }
    }
}

『なんかこうみると１関数の普通のプログラムだね』
「それが、メッセージループやメッセージキュー、ウィンドウプロシージャ
が関わってくることで、まるであたかもマルチスレッドになってるんじゃ、
っていう錯覚に陥っちゃうわけ」
『だからウィンドウプロシージャだけ別処理とか思っちゃうんだ……』
「さて、ここまでメインスレッドの流れについて見てきたのは、その問題点
を明確にするためです」
『問題点？』
「つまり」

・ウィンドウプロシージャから返ってこないと固まる。

「ってこと」
『ああ、そんなこと……って、そっか、ウィンドウプロシージャからすぐ
返ってくるとか考えてたら、それわかんないもんね』
「そういうこと。メッセージループとスレッドをちゃんと理解してないとわ
かんない部分だから。そして、この固まるのを避けるために使うのが」
『マルチスレッド！』
「というわけ。スレッドを複数使えば問題ないからね。ところが、ここから
が結構ややこしいんです」
『ここからも、ね』
「マルチスレッドで固まるのを防ぐためにはふたつの方法があります」
『ふたつの方法？』

・ウィンドウプロシージャの先の末端の処理だけをマルチスレッド化する。
　（ワーカースレッド）
・メッセージループそのものをマルチスレッド化する
　（ユーザーインターフェイススレッド）

「（）の中は MFC で使われてる名称。ワーカースレッドと、
ユーザーインターフェイススレッドってこと」
『これってつまり、ワーカースレッドの場合は』

WinMain()
{
    MessageLoop()
    {
        while( 1 )
        {
            GetMessage();

            DispatchMessage() → WndProc()
            {
                // ここの重い処理を別スレッドで処理する。
                // そうすればここからすぐ返る。
            }
        }
    }
}

『ってなるからウィンドウプロシージャで止まることがなくて、逆に
ユーザーインターフェイススレッドって方は……』

WinMain()
{
    // この MessageLoop() を複数のスレッドで呼び出す。
    MessageLoop()
    {
        while( 1 )
        {
            GetMessage();

            DispatchMessage() → WndProc()
            {
                // なら他のスレッドがここで止まっても問題なし？
            }
        }
    }
}

『……なんか自分で言っといてなんだけど違うような気がする』
「ううん、それで基本的なことは合ってるよ。多分イメージがわかないから
かな。たとえば、次のような例を想像してみて」

・ファイル検索処理を開始すると、ダイアログが出る。
　ダイアログには【キャンセル】ボタンがあって、押すと検索が止まる。

『検索が〈重い処理〉ね』
「これはワーカースレッド向け。の処理。検索部分だけ別スレッドにすれば
いいから」
『なるほど』
「対して」

・ひとつのアプリケーションで複数の種類のウィンドウがある。
　それぞれ別の処理をしていて、同時に表示できる。

「という場合にはユーザーインターフェイススレッドを使います」
『？　それって、別にひとつのアプリケーションじゃなくて、えっと……
プロセスいくつも上げればいいんじゃないの？』
「うん、たいがいはそう。そうできない場合……クリティカルセクションを
使うためやファイルロックを掛けるためにプロセスはひとつしかできない」
『げ、そういう理由もあるね』
「それにパフォーマンスの問題もあるかな。アプリひとつ立ち上げるのには
結構な時間が掛かるから、もし頻繁に立ち上げなきゃいけないとなると」
『大変なことになる……スレッドなら早い、ってこと？』
「そういうこと。でも……」
『でも？』
「実は、ユーザーインターフェイススレッドは使わない方がいいんです」
『ええっ！？』
「ユーザーインターフェイススレッドを使わない方がいい理由は、こんな感
じ」

・ MFC のユーザーインターフェイススレッドはすごく複雑で使いづらい。
・ MFC のシステムそのものがマルチスレッドに向いていない。
・同期を取るのが面倒。
・あまり使い道がない。

「実際、ほとんどの場合ワーカースレッドで間に合っちゃうから必要ないん
です」
『確かに、なんか難しそうだし、使い道も良くわからないし……』
「それに、ワーカースレッドでさえ複雑だから、余計複雑になってもわから
ないしね」
『ん？　ワーカースレッドでも複雑なの？』
「そうだよ。たとえばさっきの」

・ファイル検索処理を開始すると、ダイアログが出る。
　ダイアログには【キャンセル】ボタンがあって、押すと検索が止まる。

「を例に考えてみようか。これにはもうひとつ」

・検索処理が終わるとダイアログが閉じる。

「っていう機能が付きます」
『まぁ普通そうだよね』
「これをさっきのネストの図で書くと……」

WinMain()
{
    MessageLoop()
    {
        while( 1 )
        {
            GetMessage();

            DispatchMessage() → WndProc()
            {
                // 検索処理を別スレッドで処理する。
                // そうすればここからすぐ返る。

                // それと、ここにキャンセルボタンが押されたときの
                // 処理も記述する。
            }
        }
    }
}

// 別スレッドで呼び出される「検索処理」関数。
SearchFiles()
{
    while()
    {
        // 検索処理中……。
    }
}

「こんな感じになります」
『別スレッドで呼ばれるのが SearchFiles() ね』
「さて、ここで３つの問題が出てきます」

・SearchFiles() が終了したらダイアログを閉じる。
・検索して見つかったファイルを表示する。
・キャンセルボタンが押されたら SearchFiles() の処理を止める。

『？　そんな難しい？　検索終了したら、って WaitForSingleObject() 
使って待てばいいじゃない』
「それしたらダイアログ固まってキャンセル押せなくなるよ？」
『あ”……』
「というわけで次回に続く！」

/*
    Preview Next Story!
*/
『ここまでそれほど難しくないなーって思ってたんだけど……』
「マルチスレッドは実践が難しいからね」
『その辺もちゃんと教えてくれるの？』
「もちろん」
『というわけで次回』
＜ Version 14.26 ファイル検索アプリの準備 ＞
「につづく！」
『でもさ、この講座ってむしろ実践的なの少なくない？』
「本当に実践的なこと教えてる本なんて皆無だよ……」
『確かに……』


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

