AfxBeginThreadに引数を渡したい – プログラミング – Home

AfxBeginThreadに引数を渡...
 
通知
すべてクリア

[解決済] AfxBeginThreadに引数を渡したい

固定ページ 1 / 2

ジョン
 ジョン
(@ジョン)
ゲスト
結合: 22年前
投稿: 13
Topic starter  

AfxBeginThread関数で作成されたスレッドに
int型のデータを渡したい場合はどうすればいいのでしょうか?

出来ればグローバル変数などは使わないで第二引数のpParamを
使って渡したいのですがLPVOID型をint型に変換することが出来ません。

int kekka = 3;
LPVOID pParam = &kekka; //アドレス代入
int *hukugen = (int)(pParam); //アドレス復元(hukugenに3が入って欲しい)

どなたかご存知の方はいらっしゃいますでしょうか?


引用未解決
トピックタグ
silver fox
 silver fox
(@silver fox)
ゲスト
結合: 22年前
投稿: 10
 

> int *hukugen = (int)(pParam); //アドレス復元(hukugenに3が入って欲しい)

int*で宣言しているのになぜintにキャストする必要が?

int *hukugen = (int*)pParam;
じゃ駄目なの?


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

ちょっとゴミ気味です・・

値だけならアドレスでなくて、そのままで良いのでは・・

int kekka = 3;
LPVOID pParam = (LPVOID)kekka; //値代入
int hukugen = (int)pParam;

これなら寿命を気にしなくても良いし・・

※LPVOIDは、32ビット(32ビット環境で・・)

でも、普通は、「silver fox 」さんのレスの通り・・


返信引用
ジョン
 ジョン
(@ジョン)
ゲスト
結合: 22年前
投稿: 13
Topic starter  

main(){
int kazu = 55;
AfxBeginThread(Test,&kazu,THREAD_PRIORITY_NORMAL);
}

UINT Test(LPVOID pParam){
int kekka;
kekka = ????;
}

上のようなソースがあったとして
Testスレッドの中で55という数値をint kekkaに入れるにはどうしたら良いでしょう
か?

よろしくお願いします。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

kekka = 55;


返信引用
ジョン
 ジョン
(@ジョン)
ゲスト
結合: 22年前
投稿: 13
Topic starter  

スレッドの呼び出し口で渡しているint kazu = 55;の値が
スレッドTestの引数のLPVOID pParamを利用して
int kekka;に55という値を代入したいのですが良い方法は無いでしょうか?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

ナニ言うてるのかさっぱりわかりません。


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

silver foxさんや不良PGさんの示しているのが良い方法です。


返信引用
ジョン
 ジョン
(@ジョン)
ゲスト
結合: 22年前
投稿: 13
Topic starter  

①AfxBeginThread関数によりスレッドを呼び出す。
その際に第二引数に55という数が予め入っているInt型の値を渡す。
int kazu = 55;
AfxBeginThread(Test,&kazu,THREAD_PRIORITY_NORMAL);

②呼び出されたスレッドUINT Test(LPVOID pParam)では
引数として&kazuの値が入っている。

③ここでスレッドの内部で引数pParamを利用して
&kazuの値を復元したい(これができない)

検証結果1
下のように記述してもエラーが出てしまいます。

UINT Test(LPVOID pParam){
int kekka;
kekka = (int)pParam;
}

error C2440: 'initializing' : 'void *' から 'int' に変換することはできません。
(新しい動作 ; ヘルプを参照)

検証結果2
また下のように記述するとエラーはでませんが*kekkaの中に
欲する値(55という数字)は入らず156521という数字が入ります。

UINT Test(LPVOID pParam){
int kekka;
int *kekka = (int*)pParam;
}


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

UINT Test(LPVOID pParam){
int kekka;
kekka = *reinterpret_cast<int*>(pParam);
...
}

main(){
int kazu = 55;
AfxBeginThread(Test,&kazu,THREAD_PRIORITY_NORMAL);
...
}

...こーゆーことですか?


返信引用
ジョン
 ジョン
(@ジョン)
ゲスト
結合: 22年前
投稿: 13
Topic starter  

>>dairygoodsさん
確かにまとめて下のように書いた場合はキチンと*hukugenのなかに3は入るのですが
int kekka = 3;
LPVOID pParam = &kekka; //アドレス代入
int *hukugen = (int*)pParam;

スレッドの中で下の1行だけを記述すると3という値が入らないのです。
int *hukugen = (int*)pParam;


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

int hukugen = *((int*)pParam);
ならどうですか?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

main側のスレッドがとっくに実行を終えていて、
mainにあるkazuが無効になっているとかいうオチ
ではないですよね?


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

>②呼び出されたスレッドUINT Test(LPVOID pParam)では
>引数として&kazuの値が入っている。

&kazuの値っていうのは、ポインタなので寿命の問題だと思います。

・2でkazuを準備
・3でスレッドを起動(スレッドプロシージャはまだ呼ばれない)
・4でkazuを破棄(でもポインタ値は、残ってる)
・スレッドが起動したので5のスレッドプロシージャが呼ばれる
・pParamにポインタが入っているが実体は、すでにない・・

1 main(){
2 int kazu = 55;
3 AfxBeginThread(Test,&kazu,THREAD_PRIORITY_NORMAL);
4 }

5 UINT Test(LPVOID pParam){
6 int kekka;
7 kekka = ????;
8 }

Cっぽいコードなので・・

int g_kazu; //グローバル変数なら寿命の心配がない

main(){
g_kazu = 55;
AfxBeginThread(Test,&kazu,THREAD_PRIORITY_NORMAL);
}

UINT Test(LPVOID pParam){
int kekka;
int* pkekka = (int*)pParam;
kekka = *pkekka;
}


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

あ・・、訂正
>AfxBeginThread(Test,&kazu,THREAD_PRIORITY_NORMAL);
AfxBeginThread(Test,&g_kazu,THREAD_PRIORITY_NORMAL);


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

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