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

    KAB-studio.h


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

    送信日： 2004/11/08(Mon) No.281
    配信数： 2041
    発行元： まぐまぐ ( 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/10/31 (Sun)
　今年は散々。日曜休出。全く手つかず状態の散々なシステムを調べつつひ
な形だけ作る。なんとか終電で帰宅。下準備をしてこそのプログラマー。
なんで駄目ばかり。

2004/11/01 (Mon)
　まず現プロジェクトのバグをこつこつ修正。５時に上がって次プロジェク
トへ。でも全然進んでなかった……。説明だけして０時上がり。そして手遅
れ気味。

2004/11/02 (Tue)
　バグ続き＆明日休出。なんか昨日のは全然進んでないらしい。バカらしい
よホント……。そしてかわいそう（爆）。

2004/11/03 (Wed)
　祭日だけど休出。バグがたんまりと。９時半上がりだけどへろへろ。次プ
ロジェクトはどうなったんだろう。 WebLogic 。ハードディスク死んだか
も。そして１７０万で１９万。

2004/11/04 (Thu)
　最悪気味。午後は復活。１０時上がり。ハードディスク、物理的には壊れ
てないっぽい？　そして人生と実験。

2004/11/05 (Fri)
　昨日の夜に FINALDATA でリカバリ開始。おしごとは現プロジェクトの一
応最終日。引き継ぎのＹ氏に色々説明したらダウナーに。バグ修正も。
ハードディスク、物理的に壊れた……。まぁ実質的ダメージはないんだけ
ど。そして死んでしまう。<BR>

2004/11/06 (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.14
スレッドを作ってみる

「今回はスレッドを作ってみます」
『スレッドって Version 14.01 ( No.268 ) で説明したのだよね、プログラ
ムの流れってゆー』
「そうです。スレッドはプログラムの流れ。プロセスひとつにつき、最初に
ひとつ作られて、プログラムを進めて行きます」
『そういう意味じゃ、プロセスの数だけスレッドがあるわけね』
「そういうこと。で、今回は、スレッドをひとつのプロセスの中でもうひと
つ作ってみます」
『おお！　つまり最初の流れとは別にもうひとつ流れを作るわけね』
「そういうこと」
『……あれ？　でもさ、 Version 14.04 ( No.271 ) で……』

ミューテックス （ Mutex ）
セマフォ （ Semaphore ）
タイマー （ Waitable timer ）
イベント （ Event ）
クリティカルセクション （ Critical Section ）

『って、同期オブジェクトって５つ紹介してたじゃない。最後の
クリティカルセクションってまだ教えてもらってないよ？』
「実は、他の同期オブジェクトと違って、クリティカルセクションだけは複
数のプロセスで共有できないんです」
『あ、なるほど。ミューテックスとか、名前が同じひとつのミューテックス
を ProcessA や ProcessB で使えたけど、クリティカルセクションはそうい
うのできないんだ』
「だから、スレッドの説明をしてからクリティカルセクションの説明をしま
す」
『おー』
「さて、スレッドを使う前にまず断っておくことがあります」
『お、なんでしょー』
「スレッドを作る方法には、次の５種類があります」

・API の CreateThread() を使う
・ランタイムの _beginthread() を使う
・MFC の AfxBeginThread() を使う
・MFC の CWinThread を使う
・MFC のユーザーインターフェイススレッドを使う

『多！』
「で、この中で使うのは」

・ランタイムの _beginthread() を使う

「だけです」
『他は使わないの？』
「使いません。その理由は……」

・_beginthread() は一番簡単にマルチスレッドを使える。
・_beginthread() はランタイムの同期を取ってくれる。
・MFC はマルチスレッドに向いていない。

「といったところ。特に重要なのは〈ランタイムの同期を取る〉という点」
『これ以外は取らないの？』
「取らないんです。ランタイムはグローバル変数を多用してるから、普通に
複数のスレッドでランタイムを使うと問題が起きます。でも _beginthread() 
を使うと自動的に同期を取ってくれるから」
『複数のスレッドがいっぺんにアクセスしない！』
「というわけ。最後の MFC だけど、 MFC はスレッドをかなり怪しい使い方
してるから、マルチスレッドと組み合わせて使わない方がいいんです」
『それって MFC のプロジェクトで使っちゃいけないってこと？』
「そうじゃなくて、新しく作ったスレッドで、 MFC を使っちゃいけない、
ってこと」
『？？？』
「この辺は、実際にスレッドを使ってみないとわかんないかも……」
『じゃ、使お、使お！』
「はいはい。まず、スレッドのランタイム関数を使う時には process.h と
いうヘッダーファイルをインクルードする必要があります。 StdAfx.h にこ
んな感じに追加してみて」

#include <process.h> // 追加。

//{{AFX_INSERT_LOCATION}}

「〈//{{AFX_INSERT_LOCATION}}〉って書かれているところを探して、その
上にでも追加してください」
『インクルードファイルについては Version 6.04 ( No.104 ) さんしょー』
「では、実際に使ってみます」

// 別スレッドで呼び出される関数。
void __cdecl ThreadFunction( void *p_p )
{
    TRACE( "スレッドから。\n" );
}

// スレッドを作って呼び出す関数。
void UseThread()
{
    _beginthread( ThreadFunction, 0, NULL );
}

「ダイアログにボタンを貼り付けて UseThread() の方を呼ぶようにしてく
ださい」
『えっと』

・ThreadFunction() ： 呼ばれる方
・UseThread()      ： 呼ぶ方

『だよね』
「そういうこと。とりあえず使ってみて」
『ほい』

スレッドから。

『……いや、なんかすごく普通なんだけど……』
「まぁこれだけだとね。じゃあ関数の説明からしますまずは呼び出される方
から」

// 別スレッドで呼び出される関数。
void __cdecl ThreadFunction( void *p_p )
{
    TRACE( "スレッドから。\n" );
}

『 __cdecl って何度か出てきてるね』
「 Version 8.01 ( No.143 ) だね。関数には〈引数と戻り値の渡し方〉に
種類があって、主に」

__cdecl
__stdcall

「のどちらかが使われます」
『普通は __cdecl 、 API とか外から呼ばれるときは __stdcall なんだよ
ね』
「そういうこと。スレッドで呼び出す関数は必ず中からだから __cdecl を
付けます」
『でもデフォルトが __cdecl なんだから付けなくてもいいんじゃない？』
「デフォルトは設定によるから、安心のために」
『ふーん』
「戻り値が void 、引数が void * なのは、 _beginthread() の引数がそう
なっているから」
『じゃあその呼び出す方』

// スレッドを作って呼び出す関数。
void UseThread()
{
    _beginthread( ThreadFunction, 0, NULL );
}

『第１引数の ThreadFunction は、関数のアドレスを渡してるってヤツね』
「そう、 Version 8.07 ( No.149 ) や Version 13.17 ( No.253 ) を参
照。 _beginthread() の第１引数には以下のような関数ポインタを渡す必要
があります」

void( __cdecl *start_address )( void * )

『んと』

戻り値 (呼出方 *変数)(引数) 

『なんだよね。だから戻り値が void 、引数 void * 、あと __cdecl 付け
る、ってわけね』
「そういうこと。この関数ポインタを渡すことで、 _beginthread() が中で
別スレッドとして ThreadFunction() を呼んでくれます」
『ウィンドウプロシージャとかと同じ仕組みね』
「そういうこと。じゃあ引数の説明の続き。第２引数は 0 でＯＫ。第３引
数は、呼び出す関数の引数に渡す変数のポインタです」
『？』
「たとえば……」

void UseThread()
{
    _beginthread( ThreadFunction, 0, "あいうえお" );
}

「という形で文字列のポインタを渡すと」

void __cdecl ThreadFunction( void *p_p )
{
    TRACE( "%s\n", (char *)p_p );
    // あいうえお
}

『あ、 p_p にさっきの〈あいうえお〉が入ってる！』
「つまり、 _beginthread() の第３引数に渡したポインタが、呼び出し先関
数の void * ポインタに入ってるってこと」
『なるほど、そうしないと引数渡せないもんね。 void * ってことは、どん
なポインタでもＯＫ？』
「ＯＫ。 Version 7.04 ( No.124 ) で説明したように、汎用ポインタとし
て使えるから。構造体のポインタとか渡せば一度に複数の変数も渡せるし」
『なるほど。……でさ、やっぱいまいちスレッドってよくわからないんだけ
ど』
「というわけで次回に続く！」

/*
    Preview Next Story!
*/
『やっぱ使ってみないとよくわかんないよね』
「特にスレッドはノウハウの塊だから」
『それをしっかり教えてもらわなきゃね』
「憶えるのも大変だけどね」
『う”』
「というわけで次回」
＜ Version 14.15 スレッドを使ってみる！ ＞
『につづく！』
「こういう時は思考もマルチスレッドにしてみるとか」
『憶えるとこはひとつなんだけど』


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

・ほとはーに１話追加したい
　三人合体ホットハーブに一話追加予定。

・KAB-studio.h 縮刷版更新予定
　KAB-studio.h が２８０号に達したので縮刷版を更新しなきゃいけないん
ですが時間がなくてまだできてません（汗）。来週まで待って〜。


////////////////////////////////////////////////////////////////////
/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
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
*/
////////////////////////////////////////////////////////////////////

