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

    KAB-studio.h


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

    送信日： 2004/08/30(Mon) No.272
    配信数： 2060
    発行元： まぐまぐ ( 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/08/22 (Sun)
　午前中は洗濯とか。気付いたら昼寝。それからほとはー描き。んで部屋の
片付け。アンプの調整にはまると楽しい……。プラネテスドラマＣＤと
オーディオコメンタリー。

2004/08/23 (Mon)
　朝からだるかった……。ほとんど増えなくて良かった……。なんか無駄な
時間を過ごしてる気がする……。もう就職活動は無理だな……。

2004/08/24 (Tue)
　まったり風味。嫌われる？　かぶろぐで Machician を始めます。小説で
す。そんなに負担は掛けられないけど。激★店に変なコーナーが……。そし
て継続検討中。

2004/08/25 (Wed)
　バグ＆仕様変更がなくてヒマ……なので SQL コンポジションクラスを作
る。 SQL を再利用するために。どっかに落ちてそうではあるけど。それよ
りも９月はどうなる？　ヨドバシで超硬ホワイトレーベルとか購入。テレビ
が壊れかける。プロジェクター買おう……。

2004/08/26 (Thu)
　バグ＆仕様変更がかなり来る。ユーティリティクラスとか前もって作って
おけたら……。６時半に上がって派遣元の飲み会へ。新宿遠いなぁ。縦に走
る何かがあれば。９月一杯まで延長決定っぽい。

2004/08/27 (Fri)
　バグ＆仕様変更をがしがしと。定時上がりしてメロンブックスでいっぱい
買ってヨドバシでDVDラックを買って。そして続投。そして池袋-新宿-品川
ルート。

2004/08/28 (Sat)
　１０時にアマゾンからDVD受け取って、午前中はDVDラックの組み立て。午
後は……何してたんだろう。食欲が止まらない。オーディオコメンタリー
って脚本あるのかな。Machicianのラクガキが楽しい。


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

■　第十章　剣と魔法　−２１−

　空を包む星々。澄んだ夜空を、リシュネは見上げていた。
　碧き泉、その月夜を、心に刻みつけるように。
「行くのか？」
　闇の中から現れる雅樹。その隣には、眠そうな舞。
「……ホントに行くんだ」
　リシュネの背には、来た時と同じバッグ。
「うん……本当は、１２時間だから」
　２４時間ではなく、１２時間。村についてから、とうに過ぎている時間。
「……じゃあ、またねっ」
　満面の笑みを見せて、舞に背を向ける。
　その背中から、舞は抱きしめた。
「ま、舞……？」
「お願いだから……お願いだから、そんな笑顔、憶えないでよ……」
　舞の頬を涙が伝う。
「舞……」
　リシュネの顔。笑みはなく、辛く、でもそれは、乾いた大地に水を注ぐよ
うに、涙がこぼれていく。
　強く風が、舞った。
　頭上を強い光が照りつける。巨大なヘリが現れ、ホバリングしていた。
「……じゃ、またね」
　柔らかい笑みを見せてから、リシュネは地を蹴り空を蹴ってヘリのドアに
張り付く。無理矢理中に入ると、ヘリは急いでその場を飛び去る。
「……９月、絶対に行くから！！！」
　聞こえるはずのない轟音の中で、舞は強く叫んだ。
　きっと聞こえると信じて。
「……満足、か？」
　その雅樹の言葉は、赤葉に掛けられたもの。
　赤葉は笑みを浮かべて頷いた。
「まだ、全て信じたわけではない。でも……」
　でも、信じたい、そう思った。
                                                              (続く)

////////////////////////////////////////////////////////////////////
/*                       #pragma twice                            */
http://www.kab-studio.biz/Programing/PragmaTwice/index.html

　Version 14.05
ミューテックスを使おう！

「というわけで、今回から同期オブジェクトの具体的な使用方法について説
明します」
『はーい』
「まずは、一番使われている【ミューテックス （ Mutex ）】から」
『なんで一番よく使われてるの？』
「フリーウェアとかで〈何度実行してもプロセスがひとつだけしか起動しな
い〉っていうアプリあるでしょ」
『うん、よくあるね。あ、それに使われてるってこと？』
「そういうこと。だから普通の同期オブジェクトとしての使い方で言えば、
必ずしもよく使われてるってことでもないかな」
『ふぅ〜ん』
「さて、では実際にミューテックスを使ってみます。まず、 VC で新しくテ
ストプロジェクトを作って。プロジェクト名は ProcessA で」
『ダイアログのでいいの？』
「その方がいいかな。ちなみにテスト用プロジェクトの作り方については
Version 4.01 ( No.051 ) を参照」
『うん、できたよ』
「じゃ、次にボタンを５つ貼り付けて、ボタンを５つ貼り付けて、それぞれ
のイベントハンドラを作って」
『む、５つって結構めんどい……ん、作ったよ』
「さて、ここからがプログラム。その５つのイベントハンドラの直前に次の
ようにプログラムを書いてください」

namespace B1
{

HANDLE g_hMutex = NULL;
const char *const MUTEX_NAME = "ProcessesMutex";

// ミューテックスを作成します。
void Create()
{
    g_hMutex = CreateMutex( NULL, TRUE, MUTEX_NAME );
    TRACE( "%x\n", g_hMutex );
}

// ミューテックスを取得します。
void Open()
{
    g_hMutex = OpenMutex( MUTEX_ALL_ACCESS, FALSE, MUTEX_NAME );
    TRACE( "%x\n", g_hMutex );
}

// ミューテックスを監視して待機状態に入ります。
void Wait()
{
    TRACE( "待機開始。\n" );
    DWORD dwResult = WaitForSingleObject( g_hMutex, 120000 );

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

// ミューテックスを手放します。
void Release()
{
    ReleaseMutex( g_hMutex );
}

// ミューテックスを削除します。
void Close()
{
    CloseHandle( g_hMutex );
}

}

『お、結構長い』
「で、それぞれのイベントハンドラの中から、それぞれひとつずつ関数を呼
んでください。たとえば、ボタンの ID を書き換えずにイベントハンドラを
作った場合、関数名は OnButton1() ってなるから……」

void CProcessADlg::OnButton1() 
{
    B1::Create();
}

「という感じに呼び出すようにしてください」
『関数が５つだからボタンも５つ、ね』
「さて、ではひとつずつ見ていきます。まずは変数から」

HANDLE g_hMutex = NULL;

「これはミューテックスのハンドルを入れるためのグローバル変数」
『 HANDLE 、って API だとファイルとかもこれだよね』
「そう、 CreateFile() の戻り値、ファイルを管理するためのハンドルもこ
の HANDLE でした。ファイルも、同期オブジェクトも、全部 HANDLE で操作
することになります」
『む、なんかそれって危険じゃない？　型でハンドルの区別付かないんだ』
「そうなんだよね。 Win32API はこういう所も含めて危険だから……」
『うー』
「次に、ミューテックスの名前」

const char *const MUTEX_NAME = "ProcessesMutex";

「同期オブジェクトは、基本的に〈名前〉で識別します」
『名前、前回言ってた〈テスト〉とかのこと？』
「そうそれ。ウィンドウズ全体で共通で使うものだから、こういう名前を
使って識別します」
『他のプログラムとかち合っちゃわない？』
「その可能性もある……けど、明確なルールはないかな。１プロセスだけな
らアプリのフルパスを使えばいいんだけど」
『それなら問題なしね』
「今回のテストは複数のプロセスでアクセスするからそうもいかなくてね。
実際には他とかち合わないようなもっと長い文字列にしましょう」
『む、なんかテキトー』
「さて、ここからプログラム。まずはミューテックスの作成と削除から」

// ミューテックスを作成します。
void Create()
{
    g_hMutex = CreateMutex( NULL, TRUE, MUTEX_NAME );
    TRACE( "%x\n", g_hMutex );
}

// ミューテックスを削除します。
void Close()
{
    CloseHandle( g_hMutex );
}

『ってゆーかファイルに似てる……』
「ま、同じハンドルを扱う API だからね。 CreateMutex() がミューテック
スを作る API 。第１引数はセキュリティ関係の面倒な部分なので NULL で
ＯＫ。第２引数の TRUE は、作った直後にすぐ所有するか」
『？　作ったらすぐ持てるんじゃないの？』
「持たないこともできるってこと。前回説明したでしょ、ミューテックスを
持つとシグナルがオフで、手放すとオンになるって」
『あ！　そっか、それと関係してるんだ』
「そういうこと。この辺は次回に回します。第３引数はさっき説明した
ミューテックスの名前」
『これで決められるわけね……』
「さて、次はミューテックスの取得と解放」

// ミューテックスを取得します。
void Open()
{
    g_hMutex = OpenMutex( MUTEX_ALL_ACCESS, FALSE, MUTEX_NAME );
    TRACE( "%x\n", g_hMutex );
}

// ミューテックスを手放します。
void Release()
{
    ReleaseMutex( g_hMutex );
}

「これが、今言った、シグナルに関係する部分」
『 OpenMutex() を呼ぶとミューテックスを取得してシグナルがオフ、
ReleaseMutex() を呼ぶと手放してシグナルオン、ってこと？』
「そういうこと。これも具体的な使用例は次回説明します」
『でもさ、作ったときに持つことできるんでしょ？　だったら意味ないん
じゃ……』
「他のプロセスがもう既に作ってたら？」
『あ、作る意味ない……』
「そういう場合には OpenMutex() で開くだけだから」
『なるほど』
「最後に、待つための関数」

// ミューテックスを監視して待機状態に入ります。
void Wait()
{
    TRACE( "待機開始。\n" );
    DWORD dwResult = WaitForSingleObject( g_hMutex, 120000 );

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

「この WaitForSingleObject() は、開いたミューテックスを監視します」
『これが前回言ってた〈待機状態〉になるってやつね』
「そういうこと。 WaitForSingleObject() は、第１引数で渡された
〈同期オブジェクトのハンドル〉のシグナルがオンになるまで待ちます」
『つまり WaitForSingleObject() を呼んだらそのまま返ってこないってこ
と？』
「そういうこと。ただし、第２引数の時間が経ったら、シグナルがオンにな
らなくても待つのをやめて WAIT_TIMEOUT を返してきます」
『ん？　なんかすごい大きな数字なんだけど……』
「単位はミリ秒」
『あー、１２０秒＝２分？』
「そういうこと。ま、これはプログラムによりけりだから。タイムアウトさ
せたくない場合は INFINITE を指定します」
『でもなんか危険そう……』
「というわけで次回に続く！」

/*
    Preview Next Story!
*/
『むむむ、今回だけじゃ全然わかんない！』
「というわけで次回は実際に使ってみます」
『うんうん、具体例ないとわかんないよね』
「というわけで次回」
＜ Version 14.06 ミューテックスで排他処理 ＞
『につづく！』
「これで今回のコードの意味がわかると思うよ」
『ってゆーかそっち先の方が良かったなー』
「使い方だけわかっても意味ないでしょ」
『う”』


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

