我编写了一个应用程序,它根据DOT语法使用GraphViz生成一些图形为.gif。当我从Eclipse运行时,图像生成正常但是当我将其导出为jar时,图像被创建但是没有数据。当我在Microsoft Picture Viewer中查看它时,它只是红色的X。
它作为一个导出的jar工作,直到我将图片生成放在自己的线程中。我似乎无法弄清楚这里发生了什么。导出多线程项目有什么问题吗?有人有什么想法吗?
由于
以下是一些代码。很难确定出现了什么问题。
/**
* Writes the graph's image in a file.
* @param img A byte array containing the image of the graph.
* @param to A File object to where we want to write.
* @return Success: 1, Failure: -1
*/
public int writeGraphToFile(byte[] img, File to)
{
try {
FileOutputStream fos = new FileOutputStream(to);
fos.write(img);
fos.close();
} catch (java.io.IOException ioe) { return -1; }
return 1;
}
通过此调用从备用线程调用上述函数。
public void generateMainGraph() {
//create the graph and put it to file name mainGraphCount.gif
GraphViz gv = new GraphViz();
System.out.println("Generating MAIN graph...");
//add the ending } to mainDot
mainDot += "}";
File newGraph = new File("graphs\\main" + Integer.toString(mainGraphCount) + ".gif");
gv.writeGraphToFile(gv.getGraph(mainDot), newGraph);
}
这是调用函数的线程,该函数调用generateMainGraph(...)。
graphGeneratingThread = new Runnable() {
//This method will run in the timer thread
public void run() {
try {
//Generate the graphs
if (iData.importDataSet()) {
int timeout = 0;
Scanner scan = new Scanner(graphGen.logSource);
while(timeout < 10) {
if(!scan.hasNextLine()) {
Thread.sleep(1000);
timeout++;
} else {
timeout = 0;
graphGen.generateGraph(scan.nextLine()); //This function calls generateMainGraph(...)
if(!beginningButton.isEnabled()) {
enableTivoButtons();
}
}
}
}
} catch(Exception exc) {
System.err.println("GraphGenerationThread Runnable Error: " + exc.getMessage() + "\n");
exc.printStackTrace();
System.exit(1);
}
}
};
答案 0 :(得分:1)
检查Eclipse中的类路径。您可能在Eclipse之外的路径中遗漏了一个jar。您可以在罐子的清单中列出所需的罐子。
答案 1 :(得分:1)
如果项目在导出时是多线程的,那么它没有区别。差异是由VM如何调度线程引起的(可能通过在eclipse中运行来实现)。
由于你的问题是使用线程版本,我猜你有内部对象状态,在另一个线程的一个线程的操作过程中被破坏。例如:
这将是对0字节图像的解释。另一种情况:
这可能是图像文件损坏的原因。调试并发代码可能很棘手。我的建议是:
如果您在找到可以由多个线程同时运行的代码并且影响您的数据之后只是使该方法同步,那么您正在寻找一个“简单的解决方案”,但这可能会使您在添加时尝试实现的目标失败线程。