0

我正在尝试与我的 rails 应用程序中的 Matlab.Application.Single win32ole 对象进行交互。我遇到的问题是,当我开发我的应用程序时,每个单独的请求都会重新加载我的 win32ole 对象,所以我失去了与我的 matlab 原始实例的连接并创建了新实例。有没有办法在 Rails 中的请求之间保留活动对象?或者有没有办法重新连接到我的 Matlab.Application.Single 实例?

在生产模式下,我使用模块变量来存储请求之间的连接,但在开发模式下,模块变量会在每个请求中重新加载。

这是我的代码片段

require 'win32ole'

module Calculator
  @engine2 = nil
  @engine3 = nil

  def self.engine2
    if @engine2.nil?
      @engine2 = WIN32OLE.new("Matlab.Application.Single")
      @engine2.execute("run('setup_path.m')")
    end
    @engine2
  end

  def self.engine3
    if @engine3.nil?
      @engine3 = WIN32OLE.new("Matlab.Application.Single")
      @engine3.execute("run('setup_path.m')")
    end
    @engine3
  end

  def self.load_CT_image(file)
    Calculator.engine2.execute("spm_image('Init','#{file}')")
  end

  def self.load_MR_image(file)
    Calculator.engine3.execute("spm_image('Init','#{file}')")
  end
end

然后我可以在我的控制器中使用我的代码,如下所示:

Calculator.load_CT_image('Post_Incident_CT.hdr')
Calculator.load_MR_image('Post_Incident_MRI.hdr')
4

1 回答 1

0

您可以将应用程序范围的对象保存在不会为每个请求重置的常量中。将此添加到新文件中 config/initializers/

ENGINE_2 = WIN32OLE.new("Matlab.Application.Single")

您可能还需要在.execute("run('setup_path.m')")此处包含该行(我不熟悉 WIN32OLE)。然后,您可以将该对象分配给Calculator模块中的实例变量(只需将WIN32OLE.new("Matlab.Application.Single")调用替换为ENGINE_2,或直接引用它们。

我知道这超出了您的问题范围,但是您这里有很多重复的代码,您可能想考虑创建一个类或模块来管理您的 Matlab 实例——根据需要启动新实例,然后关闭不再使用的旧的。

于 2013-05-17T23:43:22.547 回答