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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

4767閲覧

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

mhozumim

総合スコア7

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2017/03/24 06:58

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

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

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

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

###該当のソースコード

C#

1//uGuiでButtonを作成し、OnClickに紐づけ 2public void ButtonClicK(){ 3 Thread th = new Thread(GetPath); 4 th.Start(); 5} 6 7private void GetPath(){ 8 using(var dialog = new System.Windows.Forms.OpenFileDialog ()){ 9 if(dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK){ 10 Debug.Log(dialog.FileName); 11 }else 12 Debug.Log(""); 13 } 14 return; 15}

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

###補足情報(言語/FW/ツール等のバージョンなど)
Unity5.5.2f1 32bitを使用しています。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

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を用いて起動し、結果を受け取るようにしました。

C#

1void Start(){ 2 button.OnClickAsObservable ().Subscribe (_ => { 3 Observable.Start(() => { 4 var p =new System.Diagnostics.Process(); 5 p.StartInfo.FileName ="C:\\...\\OpenFileDialog.bat"; 6 p.StartInfo.UseShellExecute = false; 7 p.StartInfo.RedirectStandardOutput = true; 8 p.StartInfo.RedirectStandardInput = false; 9 10 p.StartInfo.CreateNoWindow = true; 11 p.StartInfo.Arguments = @"/c dir c:\ /w"; 12 p.Start(); 13 14 string results = p.StandardOutput.ReadToEnd(); 15 p.WaitForExit(); 16 p.Close(); 17 return results; 18 }).ObserveOnMainThread() 19 .Subscribe(__ => { 20 Debug.Log(__); 21 },e => { 22 23 }); 24 }); 25}

###参考
バッチファイル作成

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

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

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

投稿2017/03/27 06:38

mhozumim

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問