AfxBeginThread関数で作成されたスレッドに
int型のデータを渡したい場合はどうすればいいのでしょうか?
出来ればグローバル変数などは使わないで第二引数のpParamを
使って渡したいのですがLPVOID型をint型に変換することが出来ません。
int kekka = 3;
LPVOID pParam = &kekka; //アドレス代入
int *hukugen = (int)(pParam); //アドレス復元(hukugenに3が入って欲しい)
どなたかご存知の方はいらっしゃいますでしょうか?
> int *hukugen = (int)(pParam); //アドレス復元(hukugenに3が入って欲しい)
int*で宣言しているのになぜintにキャストする必要が?
int *hukugen = (int*)pParam;
じゃ駄目なの?
ちょっとゴミ気味です・・
値だけならアドレスでなくて、そのままで良いのでは・・
int kekka = 3;
LPVOID pParam = (LPVOID)kekka; //値代入
int hukugen = (int)pParam;
これなら寿命を気にしなくても良いし・・
※LPVOIDは、32ビット(32ビット環境で・・)
でも、普通は、「silver fox 」さんのレスの通り・・
main(){
int kazu = 55;
AfxBeginThread(Test,&kazu,THREAD_PRIORITY_NORMAL);
}
UINT Test(LPVOID pParam){
int kekka;
kekka = ????;
}
上のようなソースがあったとして
Testスレッドの中で55という数値をint kekkaに入れるにはどうしたら良いでしょう
か?
よろしくお願いします。
kekka = 55;
スレッドの呼び出し口で渡しているint kazu = 55;の値が
スレッドTestの引数のLPVOID pParamを利用して
int kekka;に55という値を代入したいのですが良い方法は無いでしょうか?
ナニ言うてるのかさっぱりわかりません。
silver foxさんや不良PGさんの示しているのが良い方法です。
①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;
}
UINT Test(LPVOID pParam){
int kekka;
kekka = *reinterpret_cast<int*>(pParam);
...
}
main(){
int kazu = 55;
AfxBeginThread(Test,&kazu,THREAD_PRIORITY_NORMAL);
...
}
...こーゆーことですか?
>>dairygoodsさん
確かにまとめて下のように書いた場合はキチンと*hukugenのなかに3は入るのですが
int kekka = 3;
LPVOID pParam = &kekka; //アドレス代入
int *hukugen = (int*)pParam;
スレッドの中で下の1行だけを記述すると3という値が入らないのです。
int *hukugen = (int*)pParam;
int hukugen = *((int*)pParam);
ならどうですか?
main側のスレッドがとっくに実行を終えていて、
mainにあるkazuが無効になっているとかいうオチ
ではないですよね?
>②呼び出されたスレッド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;
}
あ・・、訂正
>AfxBeginThread(Test,&kazu,THREAD_PRIORITY_NORMAL);
AfxBeginThread(Test,&g_kazu,THREAD_PRIORITY_NORMAL);