マルチスレッド・プログラムに挑戦しているものです。
ある処理を複数の別スレッドに行わせようとしています。
ウィンドウのクライアント領域を四つにわけて、
左上にランダムに矩形を
左下にランダムに楕円を
右上にランダムに三角形を
右下にランダムに同心円を
別々のスレッドで描画させる。
このばあい、CreateThread関数にしていするThreadProcって、それぞれに一つずつ作ら
ないといけないんでしょうか?
描画する関数部分だけ、別に作っておいて、スレッド・プロシージャは同じものを使
い、メインスレッドからスレッド・プロシージャに渡すパラメータで描画関数を指定す
る。
これで何か問題がありますか?
CreateThread(描画関数1へのポインタ);
CreateThread(描画関数2へのポインタ);
CreateThread(描画関数3へのポインタ);
CreateThread(描画関数4へのポインタ);
で、ThreadProcは同じものを使うことってできますか? その辺りが分からないです。
問題ありません
> スレッド・プロシージャに渡すパラメータで描画関数を指定する。
ちゃんと分岐するならOK!
> で、ThreadProcは同じものを使うことってできますか?
出来ます。頑張って下さい。
つまり
CreateThread関数を4回よびだすと、自プロセス内に新しく4つのスレッドが作られ
る、って認識でOK?ですか? CreateThread関数内でのlpStartAddress引数で指定す
るスレッドプロシージャに同じ関数をしていしていても?
このlpStartAddressは新しいスレッドの開始アドレスを意味する、ってMSDNには載って
るんですけど・・・
一応自分で確かめたところ、同じスレッドプロシージャ関数を指定して4回
CreateThreadを繰り返し呼び出したものと、別々に四つのスレッドプロシージャを定義
して、それぞれを一回ずつCreateThreadで呼び出した場合の動作は、同じように見えた
ので、想定どおりの動作になってるようなんですが・・・
開始ポイント?(何といったらいいのか・・)、開始アドレスが同じでもスレッドは別
になっているんでしょうか?
> 開始ポイント?(何といったらいいのか・・)、開始アドレスが同じでもスレッドは別
> になっているんでしょうか?
そういうこと。
シングルスレッドでも、再帰呼び出しなどで同じ関数を呼んでもそれぞれの動作は
独立していますよね。それと同じ感覚でOKです。
関数内のstatic変数の場合は値が共有されることも含めて同じように扱えます。
まあ、static変数に関しては、新しく同期の問題が加わりますが。
>開始ポイント?(何といったらいいのか・・)、開始アドレスが同じでもスレッドは別
>になっているんでしょうか?
lpStartAddress(が示す先)は、「命令が記述されている書類」と考えてみてください
CreateThredは、呼ばれるたびに
新しい人員を用意して「この命令書を処理してね」って言ってるだけです
一つの実行ファイルを、複数同時に起動してるような感じ。
なるほど。
Create~、という名前が示すように新しくクローン(プログラム的にはインスタンスっ
て言ったほうがいいかな)を作っているようなもんなんですね。
よく分かりました。
レスありがとうございました。
解決しました。