我正在尝试与我的rails应用程序中的Matlab.Application.Single win32ole对象进行交互。我遇到的问题是,当我正在开发我的应用程序时,每个单独的请求都会重新加载我的win32ole对象,因此我松开了与matlab orignal实例的连接并创建了新的实例。有没有办法在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')
答案 0 :(得分: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实例 - 根据需要启动新的实例并关闭不再使用的旧旧的。