- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:マルチスレッドの動作停止について質問なんですが)
マルチスレッドの動作停止について
このQ&Aのポイント
- C++とDirectXを使用して作成しているマルチスレッドプログラムが動作を停止してしまいます。停止する原因について教えてください。
- マルチスレッドプログラムでの動作停止の可能性のある原因を特定するために、以下の状況を調査しました。1. 初期の読み込み時にのみマルチスレッドを使用している。2. 読み込んでいるものは3Dモデルと2D画像。3. 動作停止は3〜4回に1回の割合で発生。4. 停止する位置は毎回異なる。5. スレッドセーフであるがデッドロックは起こっていない。6. エラーは例外が出ない。
- マルチスレッドプログラムが動作を停止する原因を調査しています。停止する位置が毎回異なるため、特定の原因を特定するのは難しいですが、以下の状況が考えられます。1. リソース競合が発生している可能性がある。2. メモリのアクセスエラーが発生している可能性がある。3. スレッド間の同期がうまく行われていない可能性がある。停止する原因を見つけるために、コードを詳細に調査してください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
このページにあるように、 http://d.hatena.ne.jp/ho_5750/20120417/1334670243 >IDirect3DDevice9::Present をウィンドウメッセージを処理するスレッドとは別のスレッドから呼び出すと、この Present で固まることがあるというものでした。 のような処理はないですか?
その他の回答 (1)
- SherlockHolmes2
- ベストアンサー率40% (175/429)
回答No.1
動作停止ということは、アプリからOSに処理が戻らないということですよね。 エラーが出ていないということであれば、スレッド本体、もしくは、そのスレッドを制御している処理自体で、どこかループしてしまっているか、読み込み処理に時間がかかりすぎて動作停止しているのではないでしょうか。 スレッドの実装方法自体が間違っているということは無いですよね?
質問者
お礼
回答ありがとうございます。 ループして動作が遅いというよりは、完全に「応答無し」状態になってしまっていて、タスクマネージャーからでしか起動したエグゼファイルを終了できない状態」です いろいろと試してみた結果、毎回フリーズしてしまうのはマルチスレッドの方ではなく本スレッドのロード画面を描画しているスプライトのLPDIRECT3DDEVICE9の>Presentのあたりみたいです スレッドの実装方法ですがDirectXのLPDIRECT3D9のCreateDeviceで 「D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED」 と記述してマルチスレッドを使用しています
お礼
回答ありがとうございます。 確認したところ、確かに別スレッドからデバイス制御を行っている場所があります。 ここの処理をメインスレッドにまとめたところ確かにとまらなくなりました。 いろいろと無知ですみません。 わざわざ調べてまでいただいて本当にありがとうございます