トップページ > 過去ログ > 記事閲覧
複数レッドでのDXライブラリの利用(C#)
名前:らんまる 日時: 2011/07/09 15:17

C#版が正式サポートではないのは理解して聞きます。 スレッドAで描画を行いながら、スレッドBでデータのロードを行うと、メモリの内容が意図せず書き換わったり、LoadGraphやMV1LoadModelの呼び出しで保護領域への書き込みエラーが発生する現象を確認しました。 こういった現象は、C++版では確認されていないのでしょうか?または、DXライブラリはマルチスレッド下での利用は避けたほうがいいということでしょうか?

Page: 1 |

Re: 複数レッドでのDXライブラリの利用(C#) ( No.1 )
名前:らんまる 日時:2011/07/09 16:21

現象の再現が可能なコードを下記におきます。 最悪の場合、OSを巻き込んで落ちるようなので 注意して実行ください。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using DxLibDLL; namespace test006 { class Program { static void Main(string[] args) { LoadCont load = new LoadCont(); Thread thread = new Thread(new ThreadStart(load.Run)); DX.ChangeWindowMode(DX.TRUE); if (DX.DxLib_Init() == -1) { return; } if (DX.SetDrawScreen(DX.DX_SCREEN_BACK) == -1) return; int _counter = 0; thread.Start(); while (true) { _counter++; if (_counter > 255) _counter = 0; // スレッドが終了していたら再びスタートする。 if (thread == null || ((thread.ThreadState & (System.Threading.ThreadState.Unstarted | System.Threading.ThreadState.Stopped)) != 0)) { thread = new Thread(new ThreadStart(load.Run)); thread.Start(); } // Escキーで終了 int key = DX.GetJoypadInputState(DX.DX_INPUT_KEY_PAD1); if (key == DX.PAD_INPUT_9) { break; } // 簡単な描画 DX.DrawBox(0, 0, 640, 480, DX.GetColor(_counter, _counter, _counter), DX.TRUE); DX.DrawString(0, 0, "Now Loading...", DX.GetColor(255, 255, 255)); if (DX.ScreenFlip() == -1) return; if (DX.ProcessMessage() == -1) return; } } } public class LoadCont { public void Run() { // メモリに読み込んで消すだけ int temp = DX.LoadGraph("testpatan02.png"); DX.DeleteGraph(temp); } } }
Re: 複数レッドでのDXライブラリの利用(C#) ( No.2 )
名前:いっち 日時:2011/07/09 22:27

ご参考になるか分かりませんが、以下のスレッドに私の個人的な見解と関連のスレッドが記載されています。 > h t t p://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=2301
Re: 複数レッドでのDXライブラリの利用(C#) ( No.3 )
名前:らんまる(解決) 日時:2011/07/09 22:35

回答ありがとうございます。 もう少し落ち着いて過去スレよみます。
Re: 複数レッドでのDXライブラリの利用(C#) ( No.4 )
名前:管理人 日時:2011/07/10 20:17

載せて下さったサンプルプログラムを手元で実行してみましたが、特にエラーは発生しませんでした ただ、本来なら DxLib_Init の前に SetMultiThreadFlag( TRUE ) ; を呼ばないと DirectX が マルチスレッドを考慮した動作をしない筈ですので、恐らくたまたまエラーが発生しなかったのだと思います よろしければ DxLib_Init の前に DX.SetMultiThreadFlag( DX.TRUE ) ; という記述を増やしてお試しになってみてください また、SetMultiThreadFlag( TRUE ) ; を使用すること以外のマルチスレッドを使用する際の注意については いっちさんが載せて下さったURLの先にあるスレッドに載っていますのでよろしければご覧ください
Re: 複数レッドでのDXライブラリの利用(C#) ( No.5 )
名前:らんまる(解決) 日時:2011/07/18 01:43

管理人様、回答ありがとうございます。 DX.SetMultiThreadFlag( DX.TRUE ) ;を追加することで 私のサンプルでエラーが起きないことを確認しました。 掲示板やDxDll.csを見ているとSetMultiThreadFlagのように リファレンスにない関数や定数、構造体をいくつか見かけますが これらは仮実装のものだという認識でよいのでしょうか?
Re: 複数レッドでのDXライブラリの利用(C#) ( No.6 )
名前:いっち 日時:2011/07/18 10:20

下記URLのレス(No.2)にリファレンスに関する管理人さんのコメントがあります。 > ://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=1141

Page: 1 |