質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.91%

[Unity][Monodevelop]非同期でOpenfileDialogを開く方法

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,130

mhozumim

score 7

前提・実現したいこと

非同期でOpenfileDialogを用い、ファイルパスを取得したいと思っています。
Threadを用いて非同期処理を記述したのですが、二度目以降、OutOfMemoryException
のエラーが発生しダイアログが開きません。

どなたか問題を回避する方法をご教授いただけないでしょうか。

発生している問題・エラーメッセージ

System.OutOfMemoryException has been thrown
not enought memory to complete operation [GDI + status: OutOfMemory]

該当のソースコード

//uGuiでButtonを作成し、OnClickに紐づけ
public void ButtonClicK(){
    Thread th = new Thread(GetPath);
    th.Start();
}

private void GetPath(){
    using(var dialog = new System.Windows.Forms.OpenFileDialog ()){
        if(dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK){
            Debug.Log(dialog.FileName);
        }else
            Debug.Log("");
    }
    return;
}

試したこと

UniRxを用いて非同期処理を記述してみました。
こちらの場合も二度目以降の挙動がおかしく、
・ダイアログは開かれるがフォルダ、ファイルが表示されない
・OutOfMemoryExceptionのエラーが発生
といった状態になります。

補足情報(言語/FW/ツール等のバージョンなど)

Unity5.5.2f1 32bitを使用しています。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

概要

自己解決しましたので報告いたします。

Unity内で動作を完結させることができなかったため、
Openfiledialogを開くバッチファイルを作成し、こちらを読み込むことで対応しました。
バグが残っているとは思いますし、バッチファイル部分はほぼ写経状態ではありますが、本質問の焦点である、
Unityで非同期でOpenFileDialogを開くという目的は達成されたと考えています。 

解決方法

バッチファイルとして以下を作成し、OpenFileDialog.batとして保存しました。

@echo off
chcp 65001
set "File=C:\Program Files\*.txt"
set "Filter=テキスト (*.txt)|*.txt|すべてのファイル (*.*)|*.*|"
set "Title=ファイルの選択"
for /f "delims=" %%I in ('MSHTA.EXE "about:<object id=HtmlDlgHelper classid=CLSID:3050f4e1-98b5-11cf-bb82-00aa00bdce0b></object><script>resizeTo(0,0);function window.onload(){var Env=new ActiveXObject('WScript.Shell').Environment('Process');new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(HtmlDlgHelper.object.openfiledlg(Env('File'),null,Env('Filter'),Env('Title')).replace(/\0.*/,''));close();}</script><hta:application caption=no showintaskbar=no />"') do echo %%I

バッチファイルをSystem.Diagnostics.Processを用いて起動し、結果を受け取るようにしました。

void Start(){
    button.OnClickAsObservable ().Subscribe (_ => {
            Observable.Start(() => {
                var p =new System.Diagnostics.Process();
                p.StartInfo.FileName ="C:\\...\\OpenFileDialog.bat";
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.RedirectStandardInput = false;

                p.StartInfo.CreateNoWindow = true;
                p.StartInfo.Arguments = @"/c dir c:\ /w";
                p.Start();

                string results = p.StandardOutput.ReadToEnd();
                p.WaitForExit();
                p.Close();
                return results;
            }).ObserveOnMainThread()
                .Subscribe(__ => {
                    Debug.Log(__);
                },e => {

                });
            });
}

参考

バッチファイル作成

http://scripting.cocolog-nifty.com/blog/2009/05/post-25ec.html

バッチファイルの起動と結果読み込み

http://dobon.net/vb/dotnet/process/standardoutput.html

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る