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

    KAB-studio.h


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

    送信日： 2004/11/29(Mon) No.284
    配信数： 2036
    発行元： まぐまぐ ( 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/21 (Sun)
　午前中は荷物を受け取ってのんびりして。４時からほとはー描いて。夕方
に横浜行くもハードディスクは買わず。そしてOB会。そして DVD ドライブ。

2004/11/22 (Mon)
　１７階プロジェクト９０％１０階プロジェクト１０％。トラックナンバー
に数えられてない。 KURAU と種死がいい感じ。そして就職活動って結構大
変？

2004/11/23 (Tue)
　バルドフォースエグゼとりあえず完了。アクションはいいけどシナリオ
その他もろもろは……。そして転職に体力。そして丸善。そして RAB 。

2004/11/24 (Wed)
　VBAでこつこつプログラミング。やっとだいたいわかってきた。使いにく
い SQL ツール。 SQL*Plus もオブジェクトブラウザも使えないので代わり
に Excel で。そしてメラミンフォームとステーキ。

2004/11/25 (Thu)
　SQL と VBA でがりがりと。使いずれぇよ RBW 。１７階プロジェクトは
やりがいないなぁ……。そして業績管理。そして給料明細。

2004/11/26 (Fri)
　お昼過ぎまで１７階プロジェクト、そのあと１０階プロジェクト。
JavaScript でドロップダウンリストをリアルタイムに切り替える。それを
１１時までがりがりと。バグがなければ明日あさっておやすみ。今月は
時間外９０時間。休出残業代は大きい……。ギリギリなんだけどね。そして
DWH 。

2004/11/27 (Sat)
　お昼に起きて、洗濯、ほとはー、表紙壁紙、Machicianを。ほとはーは
外伝３を連載しようかなと。表紙壁紙はサンタさんの予定。ホントに土日
がんばってるなぁ。でも作りすぎ……。仕事減らして創作活動がんばりた
い。


////////////////////////////////////////////////////////////////////
/*                         風雅、舞い                             */
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.17
スレッドで変数を共有する

「これまでスレッドを作ってみたけど、これだけだとはっきり言って使い道
がありません」
『ってゆーかちゃんと使ってなかったね』
「スレッドを使う場合の基本方針は」

サブスレッドで処理をする。
          ↓
サブスレッドで変数に値をセットする。
          ↓
メインスレッドでそれを使う

「というものです」
『サブスレッドでなんかして、それをメインスレッドで使うわけね』
「そういうこと。たとえばサブスレッドでファイル検索をして、その結果を 
CStringArray に追加、メインスレッドでそれを呼び出して画面表示、みた
いな」
『ん？　スレッドでやっても……あ、スレッドでやると画面が止まらない
ってこと？』
「そういうこと。画面表示用のダイアログはメインスレッドで動かすから、
サブスレッドのファイル検索をしていても止まらないんです」
『なるほど』
「パスを表示しなくても、プログレスダイアログを表示したりとかね」
『プログレスダイアログ？』
「進行状況を表示するダイアログ。ゲージが描かれてて、進行状況に合わせ
て１目盛りずつ増えていくっていうあれ」
『ああ、アレね。そか、あれもダイアログだから、あの表示と、ファイル検
索とかの処理とで別スレッドにしなきゃいけないんだ……』
「そういう場合、これまでの WaitForSingleObject() を使うような単純な処
理じゃうまくいきません」
『だよね、メインスレッド止まっちゃったらダイアログ動かなくなっちゃう
もん』
「そこで、こういった場合の処理について見てみます。まず重要な点は」

・スレッド同士は変数を共有できる

「ってこと」
『それって当たり前じゃないの？』
「まぁそうなんだけどね。プロセスの時はできなかったでしょ」
『あ、そういえば……プロセスはアドレスとかポインタとかが別だから共有
できないんだもんね』
「そう。スレッドの場合、ひとつのプロセスの中での話だから、お互いに同
じ変数を使うことができます」
『だから、サブスレッドがセットしたデータをメインスレッドが見る、とか
できるわけね』
「そういうこと。というわけで、実際にその例を見てみましょう」

// 共有する変数。
int g_iData = 0;

// 止めるかどうかのフラグ。
bool g_isRun = true;

// 別スレッドで呼び出される、 g_iData を増やし続ける関数。
void __cdecl IncrementThread( void *p_p )
{
    TRACE( "スレッド開始。\n" );
    while( g_isRun )
    {
        ++g_iData;
        // 0.5 秒待ちます。
        Sleep( 500 );
    }
    TRACE( "スレッド終了。\n" );
}

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

// スレッドを止める関数。
// この関数をボタンのイベントハンドラとかで呼んでください。
void StopThread()
{
    g_isRun = false;
}

// g_iData を出力する関数。
// この関数をボタンのイベントハンドラとかで呼んでください。
void Output()
{
    TRACE( "%d\n", g_iData );
}

『長！　って、変数ふたつと小さな関数４つだけね』
「このうち」

void CallThread()
void StopThread()
void Output()

「を、ダイアログのボタンのイベントハンドラから呼ぶようにしてくださ
い」
『ボタン押して呼べるようにするわけね』
「準備ができたら、まずこれを呼びます」

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

『って、単にスレッド作って呼ぶだけね』
「その呼ばれるのがこれ」

// 別スレッドで呼び出される、 g_iData を増やし続ける関数。
void __cdecl IncrementThread( void *p_p )
{
    TRACE( "スレッド開始。\n" );
    while( g_isRun )
    {
        ++g_iData;
        // 0.5 秒待ちます。
        Sleep( 500 );
    }
    TRACE( "スレッド終了。\n" );
}

『 while でループしてる……』
「この while で見てる変数はこのグローバル変数」

// 止めるかどうかのフラグ。
bool g_isRun = true;

「これが true の間は回り続けます」
『ってことは、最初は回りっぱなしね』
「回っている間、グローバル変数 g_iData を増やし続けます。」

// 共有する変数。
int g_iData = 0;

『そのあとの Sleep() は？』
「これは、普通にループをさせるとすごい勢いで回って他のアプリに迷惑が
掛かるから」
『そういえば前にそんな話があったような』
「 Version 7.18 ( No.138 ) だね」
『そっか、タイマーの時だ』
「 CPU の性能全部使うんじゃなく、一定時間毎に休むようにすることで他
のアプリも処理できるようにするわけ」
『そうすれば他に迷惑掛けないわけねー』
「自分自身にもね」
『自分自身？』
「これはサブスレッドだから、これがすごい勢いで回るとメインスレッドに
影響が出ちゃうでしょ」
『なるほど、そのためにもってわけね』
「そういうこと。さて、このスレッドを呼ぶと、グローバル変数 g_iData 
が少しずつ増えていきます」

// 共有する変数。
int g_iData = 0;

「これを出力するのが Output() 」

void Output()
{
    TRACE( "%d\n", g_iData );
}

「スレッドを作ってから、この関数を呼ぶと」
『数字が出力されて……少し待ってから押すと増えてる！』
「こういうふうに、グローバル変数をふたつのスレッドで共有できます」
『ってゆーか普通に使えるんだね』
「それと、〈押せる〉ってことも大事」
『そか、ダイアログの方はメインスレッド、数字を増やしてる方は
サブスレッド、だからダイアログが止まらないんだね』
「で、最後にこのスレッドを止めてみます」

// スレッドを止める関数。
// この関数をボタンのイベントハンドラとかで呼んでください。
void StopThread()
{
    g_isRun = false;
}

『 g_isRun に false を入れると……』

    while( g_isRun )

『が false になるからループ抜けて、 IncrementThread() からも抜けて終
わり、ってわけね』
「そういうこと。こういうふうに、フラグをひとつ作って終了用に使うのは
よく使う方法のひとつだから」
『そういえば、これって止めないでアプリ終了させちゃったらどうなる
の？』
「メインスレッドが終了すると、サブスレッドは強制終了されます」
『強制！？』
「そう、今回の例なら〈スレッド終了〉ってメッセージが出ないで突然終了
しちゃうってこと」
『それはまずいね……』
「だから、ちゃんとする場合には、閉じるボタンとかでこのフラグを立てる
ようにします」
『おお』
「加えて、 WaitForSingleObject() でこのスレッドが終了するのを待ちま
す」
『え、待つの？』
「フラグ立てたからってすぐサブスレッドが終了するとは限らないからね。
ちゃんとサブスレッドが終了するまで待ってから、メインスレッドを終了さ
せるようにします」
『そこまでしなきゃいけないんだ……』
「特に、ちゃんとした後始末が必要なファイル出力やネットワーク処理とか
は特にね」

/*
    Preview Next Story!
*/
『スレッドは細かいとこ気を付けなきゃいけないから大変』
「その中でも一番大変なのがデッドロック」
『あの固まって動かなくなっちゃうやつね』
「というわけで次回はその解決方法」
『というわけで次回』
＜ Version 14.18 クリティカルセクションを使おう！ ＞
「につづく！」
『って、残ってた最後の同期オブジェクトじゃない』
「でも全然違うんだこれが」
『？』


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

