dポイントプレゼントキャンペーン実施中!

マルチスレッドの動作停止について質問なんですが

現在、C++とDirectXを使用してマルチスレッドプログラムを作成しているのですが、
どういう訳かプログラムそのものが動作停止を起こしてしまいます
状況としては

1、マルチスレッドは初期の読み込み時にのみ使用していて、毎回同じものを同じ順番で読み込んでいる。
2、読み込んでいるものは3Dモデル、2D画像の二つ
3、毎回動作を停止する訳ではなく、3~4回に1回の割合で停止する
4、動作を停止している位置を調べてみると毎回違う箇所で動作を停止している
5、スレッドセーフで作っており、デッドロック等は起こっていない
6、エラーは例外は出ない

以上の状況で、プログラムの停止する可能性のある原因について心当たりがある方がいれば教えていただきたいです

A 回答 (2件)

このページにあるように、


http://d.hatena.ne.jp/ho_5750/20120417/1334670243
>IDirect3DDevice9::Present をウィンドウメッセージを処理するスレッドとは別のスレッドから呼び出すと、この Present で固まることがあるというものでした。
のような処理はないですか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
確認したところ、確かに別スレッドからデバイス制御を行っている場所があります。
ここの処理をメインスレッドにまとめたところ確かにとまらなくなりました。

いろいろと無知ですみません。
わざわざ調べてまでいただいて本当にありがとうございます

お礼日時:2012/11/01 18:36

動作停止ということは、アプリからOSに処理が戻らないということですよね。


エラーが出ていないということであれば、スレッド本体、もしくは、そのスレッドを制御している処理自体で、どこかループしてしまっているか、読み込み処理に時間がかかりすぎて動作停止しているのではないでしょうか。
スレッドの実装方法自体が間違っているということは無いですよね?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
ループして動作が遅いというよりは、完全に「応答無し」状態になってしまっていて、タスクマネージャーからでしか起動したエグゼファイルを終了できない状態」です
いろいろと試してみた結果、毎回フリーズしてしまうのはマルチスレッドの方ではなく本スレッドのロード画面を描画しているスプライトのLPDIRECT3DDEVICE9の>Presentのあたりみたいです
スレッドの実装方法ですがDirectXのLPDIRECT3D9のCreateDeviceで
「D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED」
と記述してマルチスレッドを使用しています

お礼日時:2012/11/01 01:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!