クラスのメンバ関数をマルチスレッドで動かすためのメモ書き

クラスのメンバ関数をSDLのSDL_CreateThread関数で扱うためのメモ書き。ちょっと流用すれば他のライブラリでも使えるかも?
staticメンバ渡せば一発なんだろうけど。派生することを考えるとなんか色々面倒くさそうなんで、普通のメンバ関数を呼び出すようにした。

基底クラスの用意

マルチスレッドで動かすクラスの基底クラスでは、至るところで派生クラスの型がわからないと使えないので、テンプレートクラスで作成。


template <typename T> class Thread{
		private:
			struct ThreadParameter{
				T    *instance;
				void *parameter;
			};
			SDL_Thread *thread;
			/**
			 * スレッド関数呼び出し
			 * @param[in] param スレッド情報
			 * @return function()の戻り値
			 */
			static int callThread(void *param){
				ThreadParameter *tp = pointer_cast<ThreadParameter *>(param);
				return pointer_cast<T *>(tp->instance)->function(tp->parameter);
			}
		public:
			/**
			 * スレッド実行関数
			 * @param[in] param 引数
			 * @return 不明
			 */
			virtual int function(void *param) = 0;
			/**
			 * スレッド実行関数
			 * @param[in] p     派生クラスのポインタ
			 * @param[in] param スレッドに渡す引数
			 */
			void run(T *p,void *param){
				ThreadParameter tp = {p,param};
				this->thread = SDL_CreateThread(&Thread<T>::callThread,&tp);
			}
	};

1.privateにSDL_CreateThreadから呼んでもらうメンバ関数をstaticで宣言。その関数への引数として、派生クラスのポインタとスレッドへの引数をまとめた構造体を渡す。
2.callThread関数では、渡されたポインタから派生クラスのインスタンスのポインタを取り出して、マルチスレッドで実行したいメンバ関数を呼び出す。
派生クラス


class Add:public Thread<Add>{
	public:
		virtual int function(void *p);
};
int Add::function(void *p){
	FILE *file = fopen(pointer_cast<char *>(p),"w");
	fprintf(file,"start = %d\n",SDL_GetTicks());
	for(int i=0;i<2000;i++){
		fprintf(file,"i = %d\n",i);
	}
	fprintf(file,"end = %d\n",SDL_GetTicks());
	fclose(file);
	return 0;
}

マルチスレッドで使用する関数をオーバーライドするだけ。
これが呼び出されると、プログラムが起動してからのミリ秒を記録したあと、2000回ほどループして、終了時間を記録してスレッド終了する仕組み。
実行結果は

スレッドID 開始時刻 終了時刻
1 515 536
2 515 536

だから、マルチスレッドで動いてる。はず…
ちなみにpointer_castはこんな関数


/**
 * ポインターキャスト
 * @param[in] p キャストするポインター
 * @return キャスト結果
 */
template <typename T> inline T pointer_cast(void *p){return reinterpret_cast<T>(p);}

Ubuntu64bit化

先週、32bitUbuntuにOracle VM VertualBoxいれて1GBメモリ割り当てたら、なんだかんだでメモリ使い切るところまで来た。メモリ4GBまでしか認識しない(PAEいれてないし)からまぁ当たり前なんだけど。
そこで昨日からUbuntu 11.04の64bitバージョンをインストール。ただし、日本語化されていないので64bit版Ubuntuを日本語 Remixにする(このブログ、ひねくれすぎ)を参考に日本語化。flashplayerはUbuntu 10.04 LTS 64bit に 64bit版Flash Player の導入(それなりに適当にやってます)を見ながら11のベータ版を導入。
あとはapt-getでeclipse-cdtとかsubversionとかSDL周りとかインストール。
ntfs-configをいれてWindowsのDドライブに相当するのを/media/driveDにマウントするように設定。firefoxのプロファイルをwindowsと共有するようにprofiles.iniを調整。
serviceを再起動しなくてもBlueToothが生きてるのはなんでだろう?32bit限定のバグ?

JAXA一般公開に行ってきた

昨日からtwitterでイカロスくんとあかつきチームが宣伝してるから行ってきた。
朝に友達をメッセで誘って淵野辺駅へ。
淵野辺で集合してシャトルバスでJAXA相模原キャンパス…の向かいの市立博物館へ。
全天周映画「HAYABUSA BACK TO THE EARTH 帰還バージョン」の入場券買って博物館巡り。前回行ったときはハヤブサ一色だったのが、今回はイカロスやのぞみやかぐやの展示物もあった。他いろいろ見て回って列が形成されかけたところで並んで入場。
前回「HAYABUSA BACK TO THE EARTH」見たのに同じところで半泣き。つーかしょうがないとはいえ後ろの子がうるさい…友達は頭蹴られたり、2つ隣のやつがいびきかいててうるさかったそうな。ドンマイ…
映画が終わったらJAXA相模原キャンパスへ。原寸大ハヤブサの模型を見たり、イオンエンジン燃焼実験見たり撮ったり、惑星探査機見たり撮ったり、ハヤブサのコスプレしてる人がいたからいりこ持ってもらって写真撮ったりしてMV-2ロケット見て終了。シャトルバスで淵野辺駅まで行ったあと、鹿沼公園に移動してD52撮って淵野辺駅で解散。
帰ってからUbuntuを64bitにするために再インストール。日本語化パックいれてビデオドライバ入れて、現在セキュリティーアップデートインストール中。通信遅い…

本届いたー

金曜日にAmazonでポチッた「THE 鉄道漫画 002レ」が届いた。本自体は1000円だけど手数料やらなんやらで1700円取られた…orz
Amazonから届いたパッケージ
とりあえず切ってみたらまだくっついてたから切り直しを2回くらいやらかしてようやく開封
パッケージでかくね?
…本に対してパッケージでかくね?
表紙裏に3キャリア対応の壁紙プレゼントってあったからAndroidで読み込んだら403だった…もう終わってる(発行は2月)のか、Androidだから弾いたのか…欲しかった…
漫画の中身は、001レ同様鉄道中心の話がいっぱい。ギャグもあるし恋愛ものもあるしで色々揃ってる。とりあえずC11の爺さんは店内で煙吐くのやめろw

三連休終了

3  連  休  何  し  て  た  か  3  行  で(もみあげチャ~シュ~)
ゲーム
写真
ゲーム
こんな感じの連休だった。
ゲームは主にsimtrans。おかげで現在2027年。
1両しか製造されなかったクハ415-1901を組み込んだ編成が6編成くらいあったり、全力を出すと変電所を吹っ飛ばすおそれがあるEF200が6両ほど全力疾走してたり、415系とE233系,681系SREがすれ違ったり、E351系が基本編成だけのはずなのに両端非貫通だったりとゲームならではの運転。
写真はトシ様と一緒に群馬でSLとか旧客とかジョイフルトレインとか撮影。
…明日からまた仕事か。

群馬に行ってきた

この前買った特急券で群馬に行ってきた。
まず大宮でトシ様と合流。MAXたにがわで高崎へ。高崎で群馬フリーパス買って上越本線の岩本へ。
岩本ではC61-20を撮影。ここ、1時間に1本も電車が通らない時間帯があるのね…基本1時間に1本しか来ないと。ほぼ一発勝負だったけど、あまりの暑さに陽炎でまくりなこと以外は良かった。とにかく暑い。
その後、渋川でリゾート草津と宴の回送を撮影。新町でスハフ32の回送を撮影後高崎に戻って続き撮影。ついでに昼飯(15時)。その後、籠原で貨物撮ろうとしたが、期間者単機だった上に失敗…そのまま大宮で団体臨時撮って夕飯。その後、北斗星撮ろうとしたが、湘南新宿ラインがいい感じに邪魔するように停車して失敗。
トシ様と駅のホテル前で別れて帰宅。風呂はいってさぁ写真アップすんぞと写真更新システム動かしたらファイル名順にソートしてない不具合が発覚。即修正してなんとか今日中に登録終了。
http://mattyan.net/photo.php?d=1310828400
明日はどうすっか。THE 鉄道漫画の002レが出てるらしいし探してみるか。…ってこれひょっとしてネット通販のみ?

やっちまったあああああ

東方OSのReadmeに記述漏れが発覚。何故か昼飯にうどん食ってたら書いてない事に気づいた。
一応追記はしたけど、UbuntuからじゃTexはコンパイルできないし、そもそもISO焼き直してる時間がないから、明日Texをコンパイルしてpdfだけ更新し、週末に11.04.100.2として改訂版を公開予定。

東方OS11.04.100公開

とうとうリビジョン(更新回数)100回。プログラマとしてはそこまで切りの良い数じゃないけど。
今回の更新でずいぶん前にWindows向けに実装していた張り替え君の簡易版を搭載。更新間隔1分固定で指定フォルダの画像をランダムに壁紙にするようにしてみた。
ついでに前回の分から増えてるセキュリティパッチとか適用。
そろそろ共通部分だけをtrunkに設置してキャラクター固有部分はbranchesで管理するようにしないと、変更適用で死ねる。
URL: http://bit.ly/lSSM2U