在Windows 7 Enterprise上运行matlab R2010B
在matlab脚本中,我将一堆结果保存到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中,然后在我发现错误后关闭窗口。这个问题是我喜欢在出错时进入调试模式,并且捕获错误不会让我进入调试模式。
答案 0 :(得分: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问题。
答案 1 :(得分:2)
创建Wordapp
后直接使用c = onCleanup(@()Wordapp.Quit)
。当您的函数自然退出或崩溃时,c
将被删除,其功能将执行,退出Word。如果这是脚本而不是函数的一部分,您可以手动删除c
以退出。
此外 - 在开发/调试时,我会将Wordapp.Visible
设置为true
,以便您可以根据需要手动关闭字词。回到false
进行制作。