2012-05-31 119 views
2

孤兒WINWORD.EXE在Windows 7企業版如何殺死在MATLAB

運行MATLAB R2010b中在MATLAB腳本,我一堆的結果保存到一個Word文件,然後在年底,關閉和退出Word。我使用的代碼是:

WordFname = ['BatInfoDoc' sprintf('%0.3f',now) '.doc']; % serialnumbered filenames 
WordFile = fullfile(pwd,WordFname); 
WordApp = actxserver('Word.Application'); 
WordDoc = WordApp.Documents.Add; 
WordDoc.SaveAs2(WordFile); 
.... 
WordApp.Selection.TypeText([title2 title3 title4 title5 title6]); 
WordApp.Selection.TypeParagraph; 

然後終於在腳本

WordDoc.Close; 
WordApp.Quit; 

我的問題是,通過我的開發過程中,我經常死機的MATLAB腳本和風能留下孤兒結束WINWORD.EXE進程,每一個進程都會鎖定它所寫入的文件。

到目前爲止,我一直在使用TaskManager來一次一個地殺死這些進程。整個上午一直在開發,我發現自己有大約20個文件,我無法刪除,因爲它們被大約11個孤立的WINWORD.EXE進程鎖定!

我的問題: 1)有沒有一種優雅的方式來處理文件的寫入和保存以及關閉等,所以我不會鎖定文件和進程,當我的腳本崩潰之前,我到達我關閉文件並退出單詞的部分? 2)是否有一種優雅的方式來確定matlab腳本中的壞過程,並從matlab腳本中刪除它們?也就是說,我可以編碼我的matlab,使它自行清理完畢嗎?

添加了幾分鐘後: 順便說一下,我不希望將所有的代碼都放在一個大的try-catch中,然後在我發現錯誤後關閉窗口。這個問題是我喜歡去錯誤的調試模式,並發現錯誤不會帶我進入調試模式。

回答

2

直接創建Wordapp後,請使用c = onCleanup(@()Wordapp.Quit)。當你的函數退出時,無論是自然還是崩潰,c將被刪除,並且它的函數將執行,退出Word。如果這是腳本的一部分而不是功能,則可以手動刪除c以退出。

另外 - 在開發/調試時,我會將Wordapp.Visible設置爲true,以便您可以根據需要手動關閉單詞。設置回false進行生產。

+1

btw'onCleanup'的實現非常類似於@Andrey所展示的(像C++智能指針) – Amro

+0

我喜歡這兩種建議,自從發佈後我發現我可以讓我的窗口可見,而不是孤立它們。 – mwengler

+0

我正在使用這個!我實際上創建了一個非匿名清理函數,這樣我可以保存文檔,並在退出後刪除wordapp對象,並關閉另一個我在腳本中寫入的文件。 – mwengler

2

使用句柄類自動刪除它們。

classdef SafeWord < handle 

    properties(Access=public) 
     WordApp; 
    end 

    methods(Access=public) 
    function this = SafeWord(WordApp) 
     this.WordApp= WordApp; 
    end 

    function delete(this) 
     this.WordDoc.Close; 
     this.WordApp.Quit; 
    end 
end 
end 

和用例:

sw = SafeWord(Word.Application()); 
    WordApplication = sw.WordApp; 
% Do something here 

% When sw ends its lifecycle, it calls delete. 

這裏是一個related問題。