トップページ > 過去ログ > 記事閲覧
多重起動時のデータ読み込み
名前:よこたん(sogoh) 日時: 2012/03/28 14:28

 SG箱庭鉄道のスクリーンセーバーがそれらしく動くようになって きたので動作を確認していたのですが、アプリを実行している状態 でスクリーンセーバーの設定画面の子画面表示やプレビュー表示を 行なうと、LoadGraph()や、MV1LoadModel()を使用したグラフィック データの読み込みに失敗することに気がつきました。  ライブラリのソースを確認してみると、初期化処理で、アプリ実 行中は、スクリーンセーバーの動作を禁止していますので、結果的 に、アプリとスクリーンセーバーの多重起動での問題は発生しない のですが、設定画面やプレビューのことまでは考えていませんでし た。  グラフィックデータは、DxaEncode.exeでカテゴリごとにアーカイ ブしたものを読み込んでいます。読み込むタイミングはアプリの起 動時のみで、以降は、アプリと、子画面表示もしくはプレビューが 独立して動作していても、特に問題ないように思えます。  多重起動時に、アーカイブデータを読み出せるような、うまい手 はないでしょうか?

Page: 1 |

Re: 多重起動時のデータ読み込み ( No.1 )
名前:いっち 日時:2012/03/28 19:25

仰りたいことを正確に把握できていません。 ライブラリやアプリとは何を指しているのでしょうか? また、LoadGraph や MV1LoadModel が失敗している理由をどのように考えになっているのでしょうか?
Re: 多重起動時のデータ読み込み ( No.2 )
名前:よこたん(sogoh) 日時:2012/03/28 22:56

 アプリは、ウィンドウを使用するSG箱庭鉄道本体のことで、ス クリーンセーバーとは別のexeファイルです。  スクリーンセーバーとして動作させるファイルは、このファイ ルの拡張子をsrcにリネームしたものをsystem32フォルダーに放り 込んでいます。  ライブラリはDxLibのことで、DxWin.cppの中のInitializeWindow() にある、下記のステップが、Dxライブラリ使用中にスクリーンセ ーバーが起動しないようにしているものと理解しています。 // スクリーンセーバー無効 SystemParametersInfo( SPI_SETSCREENSAVEACTIVE, FALSE, NULL, SPIF_SENDWININICHANGE ) ;  この処理によって、exeファイルのSG箱庭鉄道を実行中には、ス クリーンセーバーは動作しないことになると思いますが、スクリー ンセーバーの設定ダイアログの子ウィンドウ表示やプレビューは禁 止されていないので、これらの動作としてのscrファイルのSG箱庭 鉄道は起動され、exeファイルのSG箱庭鉄道と並行して動作するこ とになります。  このとき、子ウィンドウ表示やプレビュー動作で、グラフィック データが一切表示されなかったため、LoadGraph()や、MV1LoadModel() に失敗していると推測しました。exeファイルのSG箱庭鉄道を実行し ていなければ、スクリーンセーバー設定ダイアログの子ウィンドウ表 示やプレビュー動作でも、グラフィックデータは表示されます。  スクリーンセーバーとして登録しているscrファイルのデバッグ方 法がよくわからなかったので、SetDoubleStartValidFlag(TRUE)を追 加して、exeファイルを2重起動させてみたところ、 LoadGraph()や、 MV1LoadModel()の実行で-1が返ってくることを確認しました。  単体のファイルから読み出す場合は、個々のLoadGraph()や、 MV1LoadModel()のコールごとにfloseが実行されるので、2重起動し た他のアプリがタイミングをずらしてLoadGraph()や、MV1LoadModel() をコールしても失敗することはないと考えています。  しかし、アーカイブファイルの中のデータを読み出す場合は、 LoadGraph()や、MV1LoadModel()を抜けても、アーカイブファイルは オープンされたままになっているので、2重起動した他のアプリから 同一データに対するLoadGraph()や、MV1LoadModel()が失敗する原因 になっている、というのが私の推測です。  であるのであれば、アプリ起動時にすべてのデータを読み込んだ直 後に、アーカイブファイルをクローズしてしまえば、2重起動した他 のアプリが、LoadGraph()や、MV1LoadModel()をコールしても成功す るのではないかと。  もし、この考えが正しいのであれば、オープンしたままのアーカイ ブファイルを強制的にクローズする方法があれば解決するように思い ますがいかがでしょうか。
Re: 多重起動時のデータ読み込み ( No.3 )
名前:いっち 日時:2012/03/29 20:17

SG箱庭鉄道本体とスクリーンセーバーで共通のアーカイブファイルを読み込んでいて、 どちらかが起動中にもう一方を起動すると LoadGraph や、MV1LoadModel に失敗するということでしょうか? ためしに私の環境でアーカイブファイルからデータを読み込むプログラムを作成し、 二重起動してみましたが問題なく動作しているようでした。 よこたん(sogoh)さんがご使用中のDXライブラリのバージョンはおいくつでしょうか? 過去に以下のような事象が報告されています。 > ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=past&no=2262
Re: 多重起動時のデータ読み込み ( No.4 )
名前:よこたん(sogoh)/解決済 日時:2012/03/30 14:47

 バージョンは3.04dです。教えていただいた事象の記事より も前ですね。  質問の際にバージョンを明記してなかったので、お手間をと らせてしまいました。申し訳ないです。  3.07dに差し替えて試してみたところ、アーカイブからのデ ータ読み込み関しては問題は発生しませんでした(リンク時に ソケット関連の外部参照でエラーが出たのでws2_32.libをリン クするようにして回避)。  ただ、画面表示の座標がおかしくなってしまうという致命的 な問題が発生しまして、ライブラリを差し替えただけでは済ま ない状況になっています。  新しい問題は、アーカイブの読み込みとは無関係の話で、ま た、ライブラリの使い方の問題だと思いますので、別スレッド で質問させていただきます。  ひとまず、ありがとうございました。

Page: 1 |