あれだ。サンプル作れといわれたので即興で書きました。仕事は普段CLIなんで個人的には使う機会すくないです。
#include <stdio.h> #include <process.h> //スレッドを使用するために読み込む #include <windows.h> //HANDLE型のために読み込む //スレッドのサンプル(Windows,C言語, beginthread版) #define COUNT 40 //スレッドとなる関数 戻り値void , 引数void*、呼び出し規約__stdcall指定の関数である必要がある unsigned __stdcall Thread_Function(void* p); //スレッドに渡す引数を束ねた構造体 struct arg_forThread{ HANDLE hMutex; int uid; int start; int end; int *pInteger; double* pDouble; int *pprogress; }; //////////////////////////////////////////////////////// //エントリポイント //////////////////////////////////////////////////////// int main(int argc,char* argv[]){ //処理内容 //Integer配列の中身を1/2した結果をDouble配列に格納します。 int Integer[COUNT]; //元データが入った配列 double Double[COUNT]; //結果を格納する配列 HANDLE hMutex; //排他処理用の変数 HANDLE hThread[2]; int progress = 0; for(int i = 0; i < COUNT; i++){ Integer[i] = i; } //スレッド開始の前に排他処理の設定 hMutex = CreateMutex(NULL,FALSE,NULL); //引数を設定 arg_forThread arg1 = { hMutex, 0, 0, COUNT/2-1, Integer, Double, &progress }; //引数を設定 arg_forThread arg2 = { hMutex, 1, COUNT/2, COUNT-1, Integer, Double, &progress }; //スレッド開始 //スレッドどなる関数へは引数を一つしか渡せないため、void*へキャストした構造体のインスタンスへのポインタを渡す hThread[0] = (HANDLE)_beginthreadex( NULL, 0, Thread_Function , //スレッドとして走らせる関数を指定 (void*)&arg1, //(Thread_Function)が受け取る引数 0, //すぐ実行 NULL ); hThread[1] = (HANDLE)_beginthreadex( NULL, 0, Thread_Function , //スレッドとして走らせる関数を指定 (void*)&arg2, //(Thread_Function)が受け取る引数 0, //すぐ実行 NULL ); //両方のスレッドが終了するまで待ちます。 //スレッドがすべて終了するまでフリーズすることになります。 WaitForMultipleObjects(2,hThread,TRUE,INFINITE); CloseHandle(hThread[0]); CloseHandle(hThread[1]); CloseHandle(hMutex); getchar(); //結果をゆっくり見るためのgetchar return 0; } unsigned __stdcall Thread_Function(void* p){ //引数を受け取る struct arg_forThread* parg = (arg_forThread*)(p); HANDLE hMutex = parg->hMutex; int uid = parg->uid; int start = parg->start; int end = parg->end; int* pInteger = parg->pInteger; double* pDouble = parg->pDouble; int* pprogress = parg->pprogress; for(int i = start; i <= end; i++){ Sleep(uid?7:3); //重い処理を入れないと結果がわかりにくい pDouble[i] = pInteger[i]/2.0; //処理本体 //Mutexは同一領域に書き込まない場合は必要ないので、呼出元でstart-endがダブらないようにしているpDoubleに対してはかける必要がない //pprogressが指す先のメモリは同時に変更される可能性があるので、排他処理をしないといけない WaitForSingleObject( hMutex , INFINITE ); //他のスレッドから参照できなくする (*pprogress)++; printf("%s\t%.2lf%%\t%d %lf %d\n",uid?"*":"***",(double)(*pprogress)/COUNT*100,i, pDouble[i],pInteger[i]); ReleaseMutex( hMutex ); } return 0; }
ボリュームレンダリングなどをするときに、結果にシェーディングをかけたい場合、光の反射する角度を計算するためにどうしてもボクセルの法線というものが必要になる。
そんな情報は元々ないので、以下の式で計算する。要は、自分と自分の隣、または自分の隣同士のボクセルの差を求め、その結果をベクトルの成分とする。iとi+1の差を求めるか、i+1とi-1の差を求めるかは、偉い人たちの間でも議論が分かれるようである。まあ下々の者にとってはどうでも良い。
Huluで、トム・クルーズのミッションインポッシブルの1~4までやっていたので見たんだが、その感想をなんとか人に伝える努力をしてみたいと思う。
例えば、「名探偵コナン」を劇場まで見に行った所を想像して欲しい。開始から約十分で事件が起こり、コナンが推理を始める。しかしその十分後に大きな地震がおこり、容疑者の鞄が床に落ち、はずみで中から凶器が飛び出す。「ちっ。ばれちゃあしょうがねえな!」といきなりの自白。次の瞬間には犯人がどこからかマシンガンを取り出し乱射。アガサ博士、毛利小五郎、蘭、目暮警部といった重要人物が意識不明の重体。コナンだけが体格の小ささもあって軽傷で済む。
犯人は逃走するが、後日、ネットの匿名掲示板に都会での無差別殺人の予告が書き込まれる。その時刻には警察が向かうが、犯人は戦車で現場に現れ、周囲に砲撃を繰り返す。警察の装備では歯が立たず窮地に陥るが、警察の言いつけを破り現場に来ていたコナンが戦車に飛びつき、アガサ博士のところから持ち出した新型小型爆弾の試作品を使い、戦車の装甲に穴を空ける。警察はここぞとばかりに拳銃を撃ち込み、犯人を負傷させる。だがそれでも犯人は命からがら逃走する。
数日後、警察は破棄された戦車から犯人の行動範囲を洗い出し、潜伏先の特定まで至った。犯人逮捕に向けて動き出す警察だったが、いても立ってもいられずコナンは先に潜伏先へ向かう。
そこで見たものは、負傷した犯人と、「警察は三日後にはここに来る。パスポートは用意したから国外へ逃げろ」と犯人に言い聞かせる、高木だった。
何で裏切ったんだ!みたいな会話がちょっとあって、二人は撃ち合い、犯人は死亡、高木は車で逃走。コナンも車に乗ってカーチェイスを繰り広げ、持ち前のドライビングテクニックで高木を追い詰める。後がないと悟った高木は「小学生に追い詰められるなんて、考えもしなかったよ。君は何者だい?」「江戸川コナン。探偵さ!」「まいった。僕の負けだよ」で高木が自殺。
最後、警察は潜伏先の資料から真犯人と高木について調査を開始する。ほぼ時を同じくして、コナンはみんなの見舞いに行くと、ちょうどその時蘭が目を覚まし、「蘭!よかった・・・!」で感動の終幕という具合だ。
さて。名探偵コナンを知らない人が見れば、「コナン格好いい!」「あんな小学生いたら惚れてしまうわ。」「高山みなみかわいい」みたいな感想になることは間違いない。そして別に間違った感想ではない。
だが名探偵コナンを大スクリーンで見に来た人は、
推理しろよ
としか思わない。
まあ、凄腕の原作ブレイカー(宮崎駿とか)は普通にこういうシナリオを書くので別に珍しくないのだが、悉く、どういうつもりなのか疑問が絶えない。
それでも、トム・クルーズに罪はない。作品は監督の意向に沿って作られるのだから、非難されるべきは監督だ。
と思っていたらWikipediaに、
なんて書いてある・・・結局お前が主犯か。
彼の失敗はただ一つ、タイトルを「Mission:Impossible」にしたところで、007なら恐らくなんの問題もなかっただろうし、トム・クルーズ人気で人が集まるのなら、完全オリジナルでもよかった。
大体トム・クルーズはスタントマンを使わないで全部自分で演技するところが売りの俳優だ。ところがスパイ大作戦(原作MissionImpossibleの日本版タイトル)は、いかに「何事もなかったかのように仕事をするか」が重要な作品なのだ。
ミッション・インポッシブルとは本来、”凄く難しい任務”をこなす話ではない。”そもそも成功するわけがないような”作戦を、技術とチームワークで推し進め、何が何でも成功させる。しかもそのような干渉があったこと自体しられてはならない、そんな一見地味だが息つく間もない緊張感を楽しむ作品だ。
例えば麻薬の密売組織Aが、犯罪組織Bに麻薬を売ろうとしている。これを阻止しA,Bを壊滅させろ、という指令が下る。
この時、原作のIMFなら、「Aが麻薬の輸送中に、その中身を小麦粉などにすり替え、Bが持ってくるトランクの中身の現金をすぐそれとわかる偽札にすり替え、取引時に互いの不信感を煽り撃ち合いをさせ自滅に追い込む」というプランを立てる。
実行する上で、IMFの関与がわずかでも疑われたら、AとBが自滅しなくなってしまう。そのため第三の組織の干渉の痕跡は一切残してはならない。実はここが一番難しい。爆発や銃撃戦などを起こせば、自分たちの存在を教えるようなものだから論外だ。
つまり、アクションシーンが売りの俳優が活躍できる作品ではない。
最初に1を見たときは私自身スパイ大作戦を知らなかったので十分楽しんだのも本当だ。だから作品自体はアクション映画としては最高の出来なのだ。だが原作を知ってしまったらあれをミッションインポッシブルと呼ぶわけにはいかない。
いやまじで、
なんでタイトルそれにした。
感想を聞かれたらそれしか出てこないではないか。炎上マーケティングのつもりだろうか。