Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Java UI线程被阻止-内存不足错误_Javascript_Java_Multithreading - Fatal编程技术网

Javascript Java UI线程被阻止-内存不足错误

Javascript Java UI线程被阻止-内存不足错误,javascript,java,multithreading,Javascript,Java,Multithreading,在我的应用程序中,我每秒都会收到消息,其中包含高度、速度和航向。每次收到消息时,我都需要生成一个符号(jpg)并将其显示在桌面应用程序的UI中。下面是我使用的代码。出于某种原因,只要将下面的代码集成到应用程序中,我就会不断摆脱内存错误 为了摆脱它,我将创建bellow类的实例和调用createSymbol放在一个单独的线程中,并将svg到jpg转换成单独的线程。即使这样,问题也没有得到解决。我在想,因为这段代码是每秒执行一次的,所以在内存中加载javascript库milsymbol.js会导致

在我的应用程序中,我每秒都会收到消息,其中包含高度、速度和航向。每次收到消息时,我都需要生成一个符号(jpg)并将其显示在桌面应用程序的UI中。下面是我使用的代码。出于某种原因,只要将下面的代码集成到应用程序中,我就会不断摆脱内存错误

为了摆脱它,我将创建bellow类的实例和调用createSymbol放在一个单独的线程中,并将svg到jpg转换成单独的线程。即使这样,问题也没有得到解决。我在想,因为这段代码是每秒执行一次的,所以在内存中加载javascript库milsymbol.js会导致这个问题

关于我的问题,我的理解正确吗?或者你认为会有什么问题

如果我的理解是正确的,有没有办法,我可以在内存中加载库一次,每次,我都可以引用已经加载的库来调用它的函数

你认为下面的代码有什么改进吗

public class SymbolCreation {

    private static final Logger log =
            Logger.getLogger( UAVSymbolCreation.class );

    int altitude;
    int heading;
    int speed;

    public SymbolCreation(int altitude, int speed, int heading) {
        this.altitude = altitude;
        this.heading = heading;
        this.speed = speed;
    }

    public void createSymbol() {

        synchronized(this) {
            File milSymbolLib = new File("config/4586controller/milsymbol.js");

            if(milSymbolLib.exists()) {
                try {
                    Reader libraryReader = new FileReader(milSymbolLib);
                    ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("JavaScript");
                    scriptEngine.eval(libraryReader);
                    SymbolCreation symbolCreation = this;
                    scriptEngine.put("symbolCreation",symbolCreation);
                    scriptEngine.eval("function run(symbolCreation){var altitude = symbolCreation.getAltitude(); "
                            + "var speedVal = symbolCreation.getSpeed(); "
                            + "var heading = symbolCreation.getHeading();"
                            + "symbolCreation.createSymbolSVG(new ms.Symbol('SFA-MFQ--------',{size:20, altitudeDepth:altitude, speed: speedVal , direction: heading}).asSVG());} run(symbolCreation);");
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ScriptException se) {
                    se.printStackTrace();
                }

            } 
        }

    }

    public void createSymbolSVG(String svgStr) {

        synchronized(this) {
            boolean fileCreated = false;
            File svgFile = new File("config/4586controller/symbol.svg");
            if(!svgFile.exists()) {
                try {
                    fileCreated = svgFile.createNewFile();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            } else {
                fileCreated = true;
            }

            try {
                if(fileCreated) {
                    List<String> lines = Arrays.asList(svgStr);
                    Path svgFilePath = Paths.get(svgFile.getPath());
                    Files.write(svgFilePath, lines, Charset.forName("UTF-8"));

                    //Conversion will happen on an individual thread - COMMENTED OUT 
                    convertSVGToJPEG(svgFile);

                }
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        }
    }

    public void convertSVGToJPEG(final File svgFile) {
        synchronized(this) {
            Runnable svgToJPEGConversion = new Runnable() {

                public void run() {

                    try {
                        // TODO Auto-generated method stub
                        //NOw convert svg to jpg
                        String svg_URI_input = svgFile.toURI().toString();
                        TranscoderInput input_svg_image = new TranscoderInput(svg_URI_input);        
                        //Step-2: Define OutputStream to JPG file and attach to TranscoderOutput
                        File jpgFile = new File("config/4586controller/uav.jpg");
                        if(jpgFile.exists()) {
                            jpgFile.createNewFile();
                        }

                        OutputStream jpg_ostream = new FileOutputStream(jpgFile);
                        TranscoderOutput output_jpg_image = new TranscoderOutput(jpg_ostream);              
                        // Step-3: Create JPEGTranscoder and define hints
                        JPEGTranscoder my_converter = new JPEGTranscoder();
                        my_converter.addTranscodingHint(JPEGTranscoder.KEY_QUALITY,new Float(.9));
                        // Step-4: Write output
                        my_converter.transcode(input_svg_image, output_jpg_image);
                        // Step 5- close / flush Output Stream
                        jpg_ostream.flush();
                        jpg_ostream.close();       
                    } catch (IOException ioe) {
                        ioe.printStackTrace();
                    } catch (TranscoderException te) {
                        te.printStackTrace();
                    }


                }

            };

            Thread imageConversionThread = new Thread(svgToJPEGConversion);
            imageConversionThread.start();
        }

    }

    public int getAltitude() {
        return altitude;
    }

    public int getHeading() {
        return heading;
    }

    public int getSpeed() {
        return speed;
    }

}
创建公共类符号{
专用静态最终记录器日志=
getLogger(UAVSymbolCreation.class);
国际高度;
int标题;
整数速度;
公共符号创建(整数高度、整数速度、整数航向){
这个高度=高度;
this.heading=标题;
速度=速度;
}
public void createSymbol(){
已同步(此){
文件milSymbolLib=new文件(“config/4586controller/milsymbol.js”);
if(milSymbolLib.exists()){
试一试{
Reader libraryReader=新文件读取器(milSymbolLib);
ScriptEngine ScriptEngine=new ScriptEngineManager().getEngineByName(“JavaScript”);
scriptEngine.eval(libraryReader);
SYMBOL创建SYMBOL创建=此;
scriptEngine.put(“symbolCreation”,symbolCreation);
scriptEngine.eval(“函数运行(symbolCreation){var altitude=symbolCreation.getAltitude();”
+“var speedVal=symbolCreation.getSpeed();”
+“var heading=symbolCreation.getHeading();”
+“symbolCreation.createSymbolSVG(新ms.Symbol('SFA-MFQ------',{尺寸:20,高度:高度,速度:速度,方向:航向})。asSVG();}运行(symbolCreation);”;
}catch(filenotfounde异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(脚本异常){
se.printStackTrace();
}
} 
}
}
public void createSymbolSVG(字符串svgStr){
已同步(此){
布尔fileCreated=false;
File svgFile=新文件(“config/4586controller/symbol.svg”);
如果(!svgFile.exists()){
试一试{
fileCreated=svgFile.createNewFile();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}否则{
fileCreated=true;
}
试一试{
如果(文件已创建){
列表行=Arrays.asList(svgStr);
Path svgFilePath=Path.get(svgFile.getPath());
write(svgFilePath、line、Charset.forName(“UTF-8”);
//转换将在单个线程上进行-已注释掉
convertSVGToJPEG(svgFile);
}
}捕获(ioe异常ioe){
ioe.printStackTrace();
}
}
}
public void convertSVGToJPEG(最终文件svgFile){
已同步(此){
Runnable svgToJPEGConversion=new Runnable(){
公开募捐{
试一试{
//TODO自动生成的方法存根
//现在将svg转换为jpg
字符串svg_URI_input=svgFile.toURI().toString();
TranscodeInput\u svg\u image=新的TranscodeInput(svg\u URI\u输入);
//步骤2:将OutputStream定义为JPG文件并附加到TranscoderOutput
文件jpgFile=新文件(“config/4586controller/uav.jpg”);
if(jpgFile.exists()){
jpgFile.createNewFile();
}
OutputStream jpg_ostream=新文件OutputStream(jpgFile);
转码输出\ jpg\ U图像=新转码输出(jpg\ U ostream);
//步骤3:创建JPEG转码器并定义提示
JPEGTranscoder my_converter=新的JPEGTranscoder();
my_converter.addTranscodingHint(JPEGTranscoder.KEY_质量,新浮点(.9));
//步骤4:写入输出
转换代码(输入svg图像,输出jpg图像);
//步骤5-关闭/刷新输出流
jpg_ostream.flush();
jpg_ostream.close();
}捕获(ioe异常ioe){
ioe.printStackTrace();
}捕获(代码转换){
te.printStackTrace();
}
}
};
线程图像转换线程=新线程(SVGTOJPEGONVERSION);
ImageConversionRead.start();
}
}
public int getAltitude(){
返回高度;
}
public int getHeading(){
返回航向;
}
public int getSpeed(){
返回速度;
}
}
该类使用流读取文件。 您的代码从不调用从