開発環境:VC++6.0
通信ゲームを作るために
メインで回しているループに平行して
CreateThreadでサブスレッドを作成しています。
メインとサブ間でデータ(座標データ等)を共有する場合は
メモリの共有化しか方法はないのでしょうか?
申し訳ございませんが、ご教授お願い致します。
メモリの共有ってのは抽象的な表現で意図がよくわからないが…
相手スレッドの提供するsetterメソッドを叩いて、相手スレッド固有領域にセットして
見てもらうという手もある。(これもメモリの共有というのかもしれんが…)
ただし、中途半端にセットされた値を見ないように、同期させないといけないが。
>メモリの共有ってのは抽象的な表現で意図がよくわからないが…
すみません・・
一般的なやり方を教えて頂けますでしょうか?
文脈から推測するに、
ここでいうメインとサブって、同一プロセス内で動くスレッドのように思われます。
であれば、わざわざ共有メモリを使用せずとも、データの共有はできると思うのですが…?
>>メモリの共有ってのは抽象的な表現で意図がよくわからないが…
>一般的なやり方を教えて頂けますでしょうか?
前にこんな感じで使いました。とりあえず投下。
# これって一般的なのかな…
Win9x系でしか試したことないので動くかわかりませんが…
↓アプリを1つ以上同時に起動した場合にカウントアップするだけのサンプル
test.def ********************************************
SECTIONS
seg_test READ WRITE SHARED
test.c **********************************************
#include <windows.h>
#pragma data_seg( seg_test )
int test = 0;
#pragma data_seg()
int WINAPI WinMain( HINSTANCE,HINSTANCE,LPSTR,int )
{
char Mess[32];
wsprintf( Mess,%d\n,++test );
MessageBox( NULL,Mess,test,MB_OK );
return 1;
}
…こっちのほうが一般的かな?
http://www.athomejp.com/goldfish/api/sharedmemory.asp
>メインとサブ間でデータ(座標データ等)を共有する場合は
>メモリの共有化しか方法はないのでしょうか?
書き込み内容から見ると、個人的には sugarさんの意見に賛成。
というか、共有メモリはここでは関係ないと思う。
# 同一プロセス内での共有メモリって何だろう?
スレッドの良い所にグローバル領域を使って簡単にデータを共有できるという
点があります。これがマルチプロセスだとそうはいかないのでかなり大きなメリットだと
私は考えています。
但し、グローバル境域に置くにしても排他に関しては考える必要があるので
私の場合は、共有データクラスを作成してそれに排他付きのアクセサを作成して
使用するようにしています。
共有データクラスはグローバルにインスタンスを作成します。
安全を考えるなら共有データクラスのメンバーは全てprivateにしておいて
アクセサからしかアクセスできないようにしておく方が良いでしょうね。
遅くなりましたが
皆様のおかげで解決する事ができました。
ありがとうございました^^