スレッドで引数を指定したい場合

[戻る]
ちる 2002/11/13(水) 10:01:59
いつもお世話になっております。
ちるです。

マルチスレッドでプログラミングを行なっているのですが
今は下のようなプログラミング方法であるため関数に引数を渡すことが出来ません。
例えば強引にメモリ参照などで事前に数値を設定すれば出来ないことは無いのですが
このスレッドの変数を変えて、いくつも同時に呼び出す必要があるので
適切な方法ではありません。

(ららら様のHPコンテンツVC++Tips「スレッドを作成する」をそのまま引用)
CWinThread* p_thread;
void C***View::OnInitialUpdate()
{

p_thread=AfxBeginThread(MyFunc,0,THREAD_PRIORITY_NORMAL);
}

UINT MyFunc(LPVOID pParam)
{
return 0;
}

////////////
イメージとしてはこんな感じにしたいのです。
(aとbの値を渡してMYFunc関数がスレッドとして動作する)
main()
{
int a = 3;
int b = 4;
p_thread=AfxBeginThread(MyFunc,(a,b),THREAD_PRIORITY_NORMAL);
}

UNIT MYFunc(int a,int b)
{
//処理・・・
}

いい方法はあるでしょうか?
よろしくお願い致します。

sugar 2002/11/13(水) 10:08:12
AfxBeginThread()の第2引数ではダメなんでしょうか。
確かにスレッド制御関数へは渡せる引数はひとつだけですが、
独自に構造体を定義して利用すれば・・・

YuO [E-Mail] 2002/11/13(水) 10:09:13
構造体にして渡すことで解決しませんか?
auto変数を渡すと問題になるのでnewで作った構造体になると思いますが。

tib 2002/11/13(水) 10:10:30
intの値を2つ持つような構造体を定義して、
その構造体に上記a, bの値を代入し、
その構造体のアドレスをLPVOIDにcastしてAfxBeginThread()に渡し、
MyFunc()はLPVOID型で引数を受け取ったら
即「その構造体へのポインタ」型へcastし、
構造体のメンバにアクセスすれば2つのintが参照できる。

...と思います。

ちる 2002/11/13(水) 11:43:12
ご回答ありがとうございます。

>auto変数を渡すと問題になるのでnewで作った構造体になると思いますが
そうですね!危なくauto変数で渡すところでした。
ありがとうございます。

>構造体
いくつか試してみたところ、キャストがどうもうまくいきません。
キャスト部分を簡単に説明するために下のようにプログラミングしてみました。

struct TEST
{
    int aaa;
    int bbb;    
}s_test; //構造体宣言
s_test.aaa = 3; //値設定
s_test.bbb = 4; //値設定

LPVOID pParam = &s_test;
TEST b_test = (TEST)pParam;

この時pParamに構造体アドレスが格納されているまでは確認したのですが
その下の行でb_testにキャストしたpParamを入れようとしても
「(TEST)pParamのキャストが不正である」というエラーが出てしまいます・・・

何かお気づきの点がありましたら教えてください。
よろしくお願い致します。

sugar 2002/11/13(水) 11:50:35
ポインタ渡しが有効です。

LPVOID pParam = (LPVOID)&s_test;
TEST *b_test = (TEST*)pParam;

b_test->???

・・・ 2002/11/13(水) 11:58:53
>LPVOID pParam = &s_test;
pParamの中身はTESTのポインタだから
TEST* ptest = (TEST*)pParam
なのでは?

YuO [E-Mail] 2002/11/13(水) 12:10:59
キャストとかの知識が怪しげなのかなぁ……。
説明よりコード書いた方が簡単なのでコード書いてしまいます。

struct TEST {
    int A;
    int B;
};

// スレッド作成部
    TEST * p = new TEST;
    p->A = 3;
    p->B = 4;
    p_thread=AfxBeginThread(MyFunc, p,THREAD_PRIORITY_NORMAL);

// スレッド関数
UNIT MYFunc(void * arg)
{
    TEST * p = static_cast<TEST *>(arg);
    // あとはp->A, p->Bを扱えばよい

ちる 2002/11/14(木) 09:34:39
[[解決]]
ごもっともです・・・
キャストの事が良く分かっていませんでした(T_T)
後で見るとアドレスとして渡してないし・・・

コードも書いて頂いたおかげでよく分かりました。
解決です、ありがとうございます!

古いスレッドには追加発言できません。