- ベストアンサー
(マルチスレッド)_beginthreadexに複数の引数を渡す
- マルチスレッドの関数に複数の引数を渡すことは可能でしょうか?
- _beginthreadex関数の4番目のNULLのところに引数リストを指定できるとあったのですが、その意味が良くわかりませんでした。
- 以下のプログラムの場合にマルチスレッドに変数a, b, cを引数として渡したい場合はどのように書けばいいのでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
★アドバイス ・過去に似たような質問がありました。 http://oshiete1.goo.ne.jp/qa2916783.html→『マルチスレッドについて』 ↑これは _beginthread ですが引数の渡し方は同じです。 ・http://www.kumei.ne.jp/c_lang/sdk/sdk_87.htm→『第87章 マルチスレッド その1』 ・http://www.kumei.ne.jp/c_lang/sdk/sdk_88.htm→『第88章 マルチスレッド その2』 ・http://www.kumei.ne.jp/c_lang/sdk/sdk_89.htm→『第89章 マルチスレッド その3』 ・http://www.kumei.ne.jp/c_lang/intro/no_99.htm→『99章 マルチスレッド その1』 ↑質問のソースは、ここと同じですね。 サンプル: #include <stdio.h> #include <windows.h> #include <process.h> // 渡したいすべての引数の構造体を宣言(自由に) typedef struct { int a; int b; int c; } PARAM, *lpPARAM; // スレッド側 unsigned WINAPI MyThread( void *lpx ) { lpPARAM lpParam = (lpPARAM)lpx; ←ここで構造体を受け取る for ( ; ; ){ printf( "スレッド実行中\n" ); printf( "a = %d\n", lpParam->a ); printf( "b = %d\n", lpParam->b ); printf( "c = %d\n", lpParam->c ); Sleep( 1000 ); } return 0; } // メイン側 int main( void ) { HANDLE hThread; DWORD thID; // スレッドIDの宣言 PARAM param; // 渡したいすべての引数を構造体にセット param.a = 128; ←引数a param.b = 256; ←引数b param.c = 512; ←引数c // マルチスレッドの開始 hThread = beginthreadex( NULL, 0, MyThread, ¶m, 0, (unsigned int*)&thID ); ←構造体を渡す : 処理(メイン関数実行中) : CloseHandle( hThread ); return 0; }
その他の回答 (3)
- Wr5
- ベストアンサー率53% (2173/4061)
既に回答付いていますが… 構造体に入れてポインタを渡すのがよく取られる方法です。 なお、渡す場合にはその構造体の寿命(というか、呼び出し側での構造体の寿命)に注意が必要です。 ローカル変数使う場合は…ですが。
- jacta
- ベストアンサー率26% (845/3158)
ボケるわけではありませんが、特定環境に依存した質問の場合は、環境を明らかにしましょう。 そもそもMSDNで調べること自体が間違っている可能性もあるわけですから。
- aris-wiz
- ベストアンサー率38% (96/252)
最も簡単な方法は、a,b,cをメンバに持つ構造体を定義し その構造体のポインタを渡すことで可能です。 データ構造さえ自分で作る気があれば他の方法もとれますが、 これが一番安全だと思います。
お礼
なかなかお礼ができなくて申し訳ありません。 とても助かりました。