poster
2019-12-10, 20:30
我有一个简单的M文件
function [fRate,Height,Width] = media(filename) obj = mmreader(filename); fRate = obj.FrameRate; Width = obj.Width; Height = obj.Height; end 我已使用MATLAB Builder JA成功将其编译为.jar文件。
我已经在一个单线程应用程序中测试了.jar文件,它可以正常工作。
当我在多线程GUI应用程序中使用它时出现错误。我在创建的类之一中将.jar作为线程运行,并且发生以下错误。
Java运行时环境检测到意外错误:
EXCEPTION_ACCESS_VIOLATION(0xc0000005)at pc = 0x6d9c08b0,pid = 5920,tid = 4788
Java VM:Java HotSpot(TM)客户端VM(10.0-b19混合模式Windows-x86)问题框架:
C [jvm.dll + 0x1108b0]
调试后,我发现我的线程正在调用时发生错误
media = new Media(); (我将我的.jar命名为Media.jar)
这是我的Java代码:
// mediaProperty.java
公共类mediaProperty实现Runnable {
public void mediaProperty() { Matlab_options matlab = new Matlab_options(); Object[] mediaProp = null; java.util.List lstMedia = new ArrayList(); Media media = null; try { media = new Media(); ... mediaProp = media.media(3, lstMedia); ... } catch (Exception p) { System.out.println("Exception: " + p.toString()); } finally { MWArray.disposeArray(mediaProp); if (media != null) { media.dispose(); } } } public void run() { mediaProperty(); } }
// GUI.java
私有线程mediap;
如果(mediap == null){
mediap =新线程(new mediaProperty());
mediap.start();
}
怎么了?是我的代码吗?
回答:
我的猜测是MATLAB要求您仅从一个线程访问它。您说它可以在单线程应用程序中工作,也许您需要启动一个专用线程与MATLAB交互才能使其正常工作。
也可以看看
Matlab引擎API的线程安全 (https://stackoverflow.com/questions/248421/thread-safety-of-matlab-engine-api)
更多&回答... (https://stackoverflow.com/questions/1997585)
function [fRate,Height,Width] = media(filename) obj = mmreader(filename); fRate = obj.FrameRate; Width = obj.Width; Height = obj.Height; end 我已使用MATLAB Builder JA成功将其编译为.jar文件。
我已经在一个单线程应用程序中测试了.jar文件,它可以正常工作。
当我在多线程GUI应用程序中使用它时出现错误。我在创建的类之一中将.jar作为线程运行,并且发生以下错误。
Java运行时环境检测到意外错误:
EXCEPTION_ACCESS_VIOLATION(0xc0000005)at pc = 0x6d9c08b0,pid = 5920,tid = 4788
Java VM:Java HotSpot(TM)客户端VM(10.0-b19混合模式Windows-x86)问题框架:
C [jvm.dll + 0x1108b0]
调试后,我发现我的线程正在调用时发生错误
media = new Media(); (我将我的.jar命名为Media.jar)
这是我的Java代码:
// mediaProperty.java
公共类mediaProperty实现Runnable {
public void mediaProperty() { Matlab_options matlab = new Matlab_options(); Object[] mediaProp = null; java.util.List lstMedia = new ArrayList(); Media media = null; try { media = new Media(); ... mediaProp = media.media(3, lstMedia); ... } catch (Exception p) { System.out.println("Exception: " + p.toString()); } finally { MWArray.disposeArray(mediaProp); if (media != null) { media.dispose(); } } } public void run() { mediaProperty(); } }
// GUI.java
私有线程mediap;
如果(mediap == null){
mediap =新线程(new mediaProperty());
mediap.start();
}
怎么了?是我的代码吗?
回答:
我的猜测是MATLAB要求您仅从一个线程访问它。您说它可以在单线程应用程序中工作,也许您需要启动一个专用线程与MATLAB交互才能使其正常工作。
也可以看看
Matlab引擎API的线程安全 (https://stackoverflow.com/questions/248421/thread-safety-of-matlab-engine-api)
更多&回答... (https://stackoverflow.com/questions/1997585)