• ベストアンサー

スレッド処理内の変数の参照について

大変困ってます。 今、親プロセスからスレッド内の変数に設定したいのですが方法がわかりません。 スレッドからの場合、普通行えばいいのでわかるのですが ・・・。 (詳細) メインプロセス(A) クリエートスレッド後のスレッド(B)  1.(A)で(B)をCreateThread  2.(A)の本処理で(B)の構造体にmemcpyの方法が    わかりません。  3.知っている方がいましたら教えていただけませんか。  4.読みずらい文章ですみません。宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#30727
noname#30727
回答No.2

なんとなく誤解があるような気がします。 実行ファイルを実行するとプロセスが作成され、さらに最初のスレッドが作成されます。ですから、この場合は、スレッド(A)とスレッド(B)ということになります。 そして、グローバル変数はプロセス固有のものなので、全てのスレッドから参照できます。mallocなどで取得したメモリも、アドレスさえわかっていれば、全てのスレッドから参照できます(Cのランタイムは同時に呼び出されてもいいように、マルチスレッド用のランタイムをリンクしないとダメです)。また、状況によっては、同期処理が必要になります。 スレッド(A)から、スレッド(B)が実行中の関数のローカル変数へ書き込みをするようなケースではないと思いますので省略します。 あえて、特定のグローバル変数を嫌うのであれば、SpiralGalaxyさんの言われているように、スレッド(A)がスレッド(B)を作成するときに、なんらかのワークのアドレスを渡すようにするか、TlsAlloc()などを使用して、全てのスレッドが共通のワークを参照できるようにする方法が適当だと思います。

その他の回答 (1)

回答No.1

aaa と bbb が同じ構造体だとして (A)の構造体 aaa を (b)の構造体 bbb にコピーするには… ということでいいんですね? CreateThread()の lpParameter に aaa のポインタをセットして呼び出してやって スレッド(B)でコピーしてやればいいです。 メインのスレッド { struct TEST aaa; CreateThread(…, (LPVOID)&aaa, …); … } DWORD WINAPI ThreadFunc(LPVOID pAAAA) { struct TEST* pTest = (struct TEST*)pAAAA; struct TEST bbb; memcpy(&bbb, pTest, sizeof(bbb)); ... } こんな感じでしょうか。

yoshio_n
質問者

お礼

さっそくの回答ありがとうございます。参考になりました。

関連するQ&A

  • VBで新しいスレッド

    VBのタイマーコントロールでリストの表示の更新を制御しているのですが、どうも重いので違うスレッドにしてスレッドの優先度を低くしようかと考えました。 しかしCreateThreadでスレッドを作成しようと思っても、必ず強制終了になってしまいます。 おそらくVBが複雑な変数管理構造を採っているからだと思います。 なんでもいいから新しいスレッドを作成する方法があったら教えてください。

  • c# スレッド間でのデータの共有

    C#でメインプロセスと生成されたスレッド間でデータの共有をさせたいのですがどのようにすればいいのでしょうか。ご教授お願い致します。 ・メインプロセス(A) ・Aから生成されたスレッド(B) 例えば、AとBで変数の値をそれぞれ読み書きさせたい場合 どのようにすればよいのでしょうか。 class TEST { public int flag; // メインプロセス(A) public static void Main() { Thread t = new Thread(new ThreadStart(abc)); t.IsBackground = true; t.Start(); while(ture) { Thread.Sleep(10); Console.WriteLine("A:{0}",flag); } } // Aから生成されたスレッド(B) public void abc() { Console.WriteLine("B:{0}",flag); flag++; } }

  • win32 スレッドのハンドルついて

    windowsのスレッドについての質問です。 今、手元にある書籍のスレッドを作る節にCreateThread()関数を使ってスレッドを作るサンプルプログラムが載っています。 その中では CloseHandle()関数が一切呼ばれていません。 しかも、そのサンプルではいくつもスレッドを作り、そのスレッドはプログラム中でいくつも終了するようなものです。CloseHandle()は呼び出さなくても問題ないのでしょうか? しかし、ネットで調べてみるとCloseHandle()を呼び出さなくてはいけないということが書かれていました。 http://www.daccho-it.com/program/WinApi/thread.htm ↑ 参考にしたサイト そこでいくつか質問です。 プロセスが終了するときにスレッドのハンドルは自動的に閉じられるという認識で大丈夫でしょうか? CreateThread()、_beginthreadex関数はCloseHandle()を呼び出す必要があるで大丈夫でしょうか? となると、CreateThread()の戻り値は必ず変数に保存しておく必要があるということですか? 書籍のサンプルではCreateThread()の戻り値はどこにも保存していませんでした、保存しない場合ハンドルが作られないってことはさすがにないですよね? よろしくお願いします。

  • スレッド処理からダイアログを表示するには?

    Windows XPとVC++ 6.0で 時間のかかる大量の計算をするプログラムを作っています。 計算部分はスレッド処理にして 進捗ダイアログ(CDialogにCProgressCtrlを貼り付けたもの) を表示します。 ・CWinAppのInitInstanceで計算処理開始(AfxBeginThread) ・計算処理内で進捗ダイアログをCreate ・計算の進み具合によって進捗ダイアログのプログレスバーを更新 上記の流れではうまくいっていたのですが 以下のように変更したところ、進捗ダイアログをCreateするところで プログラムが応答なしになってしまうようになりました。 ・メインダイアログ(モーダル) ・メインダイアログのAボタンクリックでダイアログAを開く(モーダル) ・ダイアログAの実行ボタンクリックで計算処理開始(AfxBeginThread) ・計算処理内で進捗ダイアログをCreate ・計算の進み具合によって進捗ダイアログのプログレスバーを更新 MFC Wizardでダイアログベースで作成、MFCの共有DLLを使用しています。 モーダルダイアログ→スレッド→CDialog.Createに 制限があったりするのでしょうか。 どうかご教授ください。

  • スレッドについて

    スレッドについて勉強中なのですが、簡単なスレッド作り、 スレッドの処理が終わってからメインの処理を行わせたくて 以下のようなプログラムを書いてみました。 そこで、WaitForSingleObjectを使ってスレッドが終了するのを 待ちたいのですが、WaitForSingleObjectではまってしまうようで sprintfのメッセージ(スレッドが止まってしまっている)が 表示されません。 WRITE関数の処理が終われば、、WaitForSingleObjectで処理が 戻ってくると考えているのですが…。 スレッドについてと、間違いについて教えてもらえないでしょうか? 宜しくお願いします。 main { if(!stop) {   File = CreateFile(...); g_hThead = CreateThread(NULL,0,WRITE,(LPVOID)NULL,0,NULL); g_stop = false; }else { g_stop = true; ::WaitForSingleObject(g_hThead, INFINITE); CloseHandle(File); CloseHandle(hThead ); } } void WRITE() { while(!g_stop) { WriteFile(...); } ...処理を行う sprintf("スレッドを終了します。") }

  • java のスレッドについて

    java のスレッドについて javaでスレッドを作って処理をさせたいと思います。 メインのクラスでスレッドAを呼び出し、スレッドAで計算をしてその結果をメインのクラスで利用したい場合、一番簡単な方法は何でしょうか? なお、メインのクラスは、 while (Thread.isAlive()); な感じでスレッドが終わるまで処理を止めておきたいと思います。 簡単なコードを書いていただけないでしょうか?

    • ベストアンサー
    • Java
  • マイコン C言語 割り込み処理で変数参照

    マイコンのC言語で1つ困っています。 メイン処理である条件でグローバル変数Aを設定しています。 また、割り込み処理をタイマーとして使い、グローバル変数Aを参照しています。 このような動作の時に割り込み処理でグローバル変数Aを参照した際にエラーで動作しなくなります。 おそらく、同じデータをメイン処理での設定と割り込み処理での参照を行ったせいだと思いますが、 何かPICプログラミングとして最適な対処法はありますか? 是非、ご教授お願いします。

  • グローバル変数が正常に参照できない?

    Windows2000、VC++6.0 でMFCを使ってダイアログベースのEXEを作っています。 以下のようにグローバル変数をループ処理の終了条件に使ってみたのですが、Release版でビルドしたEXEだと意図した動作となりませんでした。 何か原因について心当たりのある方がいればご教授願います。 ------------------------------------------- BOOL bThreadEndFlag; // 外部変数 ●FuncA()関数でスレッドを作成します。 FuncA() {  bThreadEndFlag = FALSE;  CreateThread(..., ThreadFunc, ...);  Sleep(60000);  bThreadEndFlag = TRUE;  ◆     ・     ・ } ●スレッドではフラグがFALSEの間ループします。 ThreadFunc() {  while(bThreadEndFlag == FALSE ) {   X = Y;   ★  } } ------------------------------------------- 上記ではスレッド作成後、60秒後にはフラグがTRUEになり、スレッドが終了することを想定した造りになってます。 しかし、実際にはループ処理が終わらず、スレッドが終了しませんでした。 論理的にはちょっと理解できません。。。 いろいろ試して、以下の場合は正常に動作しました。 (1)コードは全く同じままで、Debug版でビルドした場合はOKでした。 (2)★の部分に「Sleep(0)」を追加した場合はRelease版でもOKでした。 <備考> ◆の位置でフラグの値がTRUEになっていることは確認しました。

  • スレッドの安全な終了のさせ方

    スレッドの安全な終了のさせ方  メインスレッドにてCreateThread命令を使い、あるサブスレッドを作りました。 このサブスレッドは内部でmallocを使い動的に配列領域を確保して その配列領域をforループ等で「かなり時間の掛かる処理」として繰り返し アクセスしています。 ループが終了した時に「free」を実行してmalloc領域を開放しています。 アプリ終了時にメインスレッドからこのサブスレッドを終了させるのに メインウインドウにWM_DESTROYメッセージが送られた時、これまで単に そこで「CloseHandle(hSubThread);」とだけ書いていたのですが、 もしかしたらこれでは場合によっては(サブスレッドがループ処理中だったら) malloc領域が開放されずにリークしてしまうのではないかと思いました。  そこでイベントオブジェクトを使い、サブスレッドがループ処理中の 時には非シグナル状態にして、ループが終了しfreeで領域を開放した後 シグナル状態にするということにして、メインスレッドはそれを WaitForSingleObjectで待つという構造にしました。 ところが「メインスレッドに待ちを作るな」という言葉通り、これでは 上手く行きませんでした。サブスレッドはその時間の掛かる処理の 最中でSendMassage等でメインスレッドの処理を促すような命令を (例えばその処理の進捗状況を表示するなど)を幾つも行っていたので、 もしWaitFor~でメインを待たせると「サブスレッドの処理も進まなくなり 結果両方がロックして動かなくなってしまう」という悲しい状況に 嵌ってしまうのです。 SendMessageを徹底的に無くすということも考えたのですが、 (例えばPostMessageに書き換えるなどもやってみたのですが、これは 全く意図した動作をしてくれない場合もあり)、別の方法では どうしても代替できないケースもあって、全て消すというのは 現実的ではないのかもと。。  このようなサブスレッドを安全に終了させるにはどうしたら良いでしょうか? あるいは単にデストロイ時にCloseHandleとするだけでも良いのでしょうか?

  • グローバル変数について

    ヘッダに宣言した構造体にあるモジュールでテデータを格納し、 各々のモジュールでそのデータを参照したいのですが、 以下の方法で可能でしょうか? ##CMN.h### typedef struct { char AAA[5]; char BBB[5]; }stCmn; typedef stCmn Cmn_inf; ###A.c### memcpy(Cmn_inf.AAA,"TEST",4); ###B.c### char A[5]; memcpy(A,CMN_inf.AAA,4); ※ A.c B.cに #include "CMN.h"を記述

専門家に質問してみよう