- - PR -
やっぱりわからないGCの動作
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2002-12-05 18:14
ガベージコレクションは明示的に呼び出せないのでしょうか?
OLEからExcelを起動します。このExcelを非表示にしてマクロを使ってワークシートを作成します。シートを保存してExcelを終了します。このとき、Windowsのメモリ上にはExcelが残ります。 dim exapp as Excel.Application = CreateObject("Excel.Application") excel操作省略 exapp.Visible = True exapp.ScreenUpdating = True exapp.Quit exapp = Nothing 最後にCreateObjectで作成したメモリへの参照にNothingを入れていますが、Windowsのメモリ上にはEXCELが残っています(タスクマネージャで確認)。このEXCELが残っている間にファイルマネージャからExcelに関連づけられたファイルをダブルクリックで起動すると、Excelの枠だけが表示され、シートが表示されません。 このExcelを終了し、もう一度Excelに関連づけられたファイルをダブルクリックで起動すると、タスクマネージャ上では一瞬EXCELが2つ表示され、先にあった方が消えて今度はシートが表示されます。このことから、アプリケーションはExcelを解放しており、ガベージコレクションが行われるのを待っていると判断しました。 以前に『GC.Collection()でガベージコレクションが行われる』とご回答いただきましたが、exapp = Nothingの後にこれを入れても、タスクマネージャ上にEXCELが残ったままです。それとも、ただ単に「GC.Collection()」と書くのではなく、何か準備が必要なのでしょうか。 | ||||||||
|
投稿日時: 2002-12-05 18:41
おそらくGCとは無関係の問題だと思います。
たとえば、こんなのをQuitの前に入れたらどう動きますか?
Jittaさんのコードの最後に次のコードを入れて実行してみましたが、メッセージボックスが表示されている間(アプリは終了していない)に、無事EXCEL.EXEは終了しました。
| ||||||||
|
投稿日時: 2002-12-05 19:04
GCの明示的呼び出しとは異なりますが。 System.Runtime.InteropServices.Marshal.ReleaseComObject(ww); はどうでしょう? すみません。試していません。 | ||||||||
|
投稿日時: 2002-12-05 21:15
これで消えてくれました。 エクセルにデータをコピーするのに時間がかかるので、スレッド用のクラスを作成して処理していたのですが、スレッド処理クラスの中でNothingにするだけでなく、スレッド処理クラス自身をNothingしてやらなければいけなかったようです。 そのまま引用するととんでもない量なのでメインになるところだけに削っているのですが、前回といい、その削った部分に問題が潜んでいるというのは、まだまだ経験値が足りませんね ー。ー; どうもありがとうございました。 [ メッセージ編集済み 編集者: Jitta 編集日時 2002-12-05 21:20 ] |
1