2

在 Windows 7 企业版上运行 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 中,然后在我发现我的错误后关闭窗口。问题是我确实喜欢在出错时进入调试模式,并且捕获的错误不会让我进入调试模式。

4

2 回答 2

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.

这是一个相关的问题。

于 2012-05-31T17:52:15.733 回答
2

创建后直接Wordapp使用c = onCleanup(@()Wordapp.Quit). 当您的函数自然退出或崩溃退出时,c将被删除并执行其函数,退出 Word。如果这是脚本而不是函数的一部分,您可以手动删除c以退出。

另外 - 在开发/调试时,我会设置Wordapp.Visible为,true以便您可以在必要时手动关闭 word。回到false生产。

于 2012-05-31T20:09:47.530 回答