お世話になっております、シルフィーです。VB.netからExcelを起動し、その後Excelを閉じるとVB.net側のPGが少しの間停止してしまいます。この事象は回避できないのでしょうか。宜しくお願いします。環境です。OS:WInXPVB.net2005、OfficeXP
> VB.netからExcelを起動し、その後Excelを閉じると> VB.net側のPGが少しの間停止してしまいます。> この事象は回避できないのでしょうか。Excelを扱った場合にのみ起こるのなら、Excelがキチンと解放されているか確認して見て下さい。因みに、私も時々操作を受け付けない場合がありますが、その時は、一度、最小化して元に戻すと直ります。http://hanatyan.sakura.ne.jp/vb60bbs/wforum.cgi?mode=allread&no=11027&page=0
はなちゃんご回答ありがとうございます。> Excelを扱った場合にのみ起こるのなら、Excelがキチンと解放されているか> 確認して見て下さい。確認した結果、メモリはきちんと解放しておりました。(はなさんのサイトに掲載されているのを参考に作成)> 因みに、私も時々操作を受け付けない場合がありますが、その時は、一度、最小化して> 元に戻すと直ります。私の場合は3秒ルールのように、必ず使えない絶対時間みたいなのが設定されております。もしかしたらガベージコレクションが走った際に、止まっているのではないのかなと推測しております。まだまだ解決しそうにないので、情報ありましたら宜しくお願いします。
>もしかしたらガベージコレクションが走った際に、止まっているのではないのかな>と推測しております。どのように検証したのでしょうか?具体的な結果も書き込んでください。[VB.NET]のガベージコレクションはメモリが足らなくなるまで走りません。以前、SPREAD for .NET を使用してテストしたときは、タスクマネージャで8割くらいまでメモリ使用量が増え続けていました。Excel を閉じた時に、[VB.NET]側でのメモリ回収は実行されていない気がしますが?Excel は閉じた時に、終了処理を裏でやっているようです。(画面の表示が消えてもしばらくプロセスが残っている)>VB.net側のPGが少しの間停止してしまいます。他のアプリケーションはサクサク動くんですか?上記のタイミングで再度 Excel を起動しようとすると、かなり待たされる場合があります。もともと、Excel は重いアプリケーションですし、Excel を扱ったサイトでは、定期的に一時ファイルを削除しないと、Excel そのものが重くなるといった情報もあります。[VB.NET]側でエラー処理が実行されている可能性はないですか?初回例外を返すまでに時間が掛かる場合があります。また、データベースの検索時のタイムアウト設定など、処理上、時間が掛かる処理を見落としていませんか?# 新規プロジェクトで Excel との連携処理のみを実行しても同じ状況なのでしょうか?具体的なテストコードを作成して、原因を追求できるような情報を出してください。今は、どんなプログラムを実行しているのかさえ分かりません。質問は、単純に Excel を開いて閉じるだけのコードでの結果なのですか?
レスありがとうございます!!!> どのように検証したのでしょうか?具体的な結果も書き込んでください。検証方法としてはタスクマネージャ開いて、VBのメモリとExcelのメモリを見て、タスク切り替えの際に、メモリ値が変化していたようなのでそのタイミングでGCが走っているのだと思いました。> [VB.NET]のガベージコレクションはメモリが足らなくなるまで走りません。VB.netのGCはOSに依存します。メモリが足りなくなるまで解放しないということはありませんよ^^;1ドリブンのシーケンシャルな流れの場合はそうなのかもしれませんが。。> Excel を閉じた時に、[VB.NET]側でのメモリ回収は実行されていない気がしますが?DDEで実行してるわけで、実行したエクセルとvbとをプロセスパイプしてるわけではないので解放はExcel自身が行うものだと思います。ただし、vbからExcel操作完了後はもちろんComオブジェクトの解放は行っております。> >VB.net側のPGが少しの間停止してしまいます。> 他のアプリケーションはサクサク動くんですか?他のアプリは確認しておりません。確認したいのですが再現率が5%くらいなのでなかなか難しいのですよ。> [VB.NET]側でエラー処理が実行されている可能性はないですか?初回例外を返すまでに> 時間が掛かる場合があります。また、データベースの検索時のタイムアウト設定など、> 処理上、時間が掛かる処理を見落としていませんか?それはないかと思います。例外処理に流れるような処理ではないので。> 質問は、単純に Excel を開いて閉じるだけのコードでの結果なのですか?上記のようなコードではないことは確かです。これからそれについて確認してみたいと思います。改めて情報が分かり次第報告させていただきます。ありがとうございます。
Excel を扱った場合に発生するなら。GC を実行しない。VBのプログラムを終了しないExcel の起動・終了はできれば数回実行する以上の状態で、Excelが解放されている事を確認して下さい。
返信ありがとうございます!!> GC を実行しない。> VBのプログラムを終了しない> Excel の起動・終了はできれば数回実行する> 以上の状態で、Excelが解放されている事を確認して下さい。解放されておりました。(解放の定義:タスクマネージャにExcelのプロセスが残っていない)宜しくお願いします。
画面の切り替わりのタイミングで、GCが呼ばれていたようです。OSの動作として。そこで僕はExcel出力後に強制GCの処理を組み込みました。その結果、画面が一定時間フリーズすることもなくなりました。以上より、GCの処理に時間がかかっていたものと推測されます。以上です。
> 質問は、単純に Excel を開いて閉じるだけのコードでの結果なのですか?Excel を開いて閉じるだけのコードの場合、この事象の再現パターンは存在しませんでした。開いて閉じるに肉付けしただけのコードなのですが。そしてRangeに設定する場合も逐一MRComObject(仮面舞踏会さんの)呼んでますし。ん〜、たかが3秒ルール、されど3秒ルール。そこが問題なのですが。。。