スレッドで引数を指定したい場合 – プログラミング – Home

スレッドで引数を指定したい場合
 
通知
すべてクリア

[解決済] スレッドで引数を指定したい場合


ちる
 ちる
(@ちる)
ゲスト
結合: 23年前
投稿: 77
Topic starter  

いつもお世話になっております。
ちるです。

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

(ららら様の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
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

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


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

構造体にして渡すことで解決しませんか?
auto変数を渡すと問題になるのでnewで作った構造体になると思いますが。


返信引用
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

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

...と思います。


返信引用
ちる
 ちる
(@ちる)
ゲスト
結合: 23年前
投稿: 77
Topic starter  

ご回答ありがとうございます。

>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
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

ポインタ渡しが有効です。

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

b_test->???


返信引用
・・・
 ・・・
(@・・・)
ゲスト
結合: 23年前
投稿: 16
 

>LPVOID pParam = &s_test;
pParamの中身はTESTのポインタだから
TEST* ptest = (TEST*)pParam
なのでは?


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

キャストとかの知識が怪しげなのかなぁ……。
説明よりコード書いた方が簡単なのでコード書いてしまいます。

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を扱えばよい


返信引用
ちる
 ちる
(@ちる)
ゲスト
結合: 23年前
投稿: 77
Topic starter  

ごもっともです・・・
キャストの事が良く分かっていませんでした(T_T)
後で見るとアドレスとして渡してないし・・・

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました