gpt4 book ai didi

java - 项目在 Eclipse 中工作,但导出时不工作

转载 作者:行者123 更新时间:2023-12-02 08:32:18 27 4
gpt4 key购买 nike

我编写了一个应用程序,它使用 GraphViz 根据 DOT 语法生成一些 .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);
}
}
};

最佳答案

导出项目时,项目是否是多线程并没有什么区别。差异是由 VM 调度线程的方式造成的(这可能会受到在 eclipse 内部运行的影响)。

由于您的问题在于线程版本,我的猜测是您的内部对象状态在一个线程的操作过程中被另一个线程破坏。例如:

  1. 线程A生成图像数据
  2. 线程 B 将数据数组替换为空数组
  3. 线程 A 写入数据(在步骤 2 中现在为空)

这是对 0 字节图像的解释。另一种情况:

  1. 线程A开始生成图像数据
  2. 线程B开始生成图像数据
  3. 线程A完成数据生成。
  4. 线程 A 写入图像数据(现在包含线程 B 的部分数据)

这可能是图像文件损坏的原因。调试并发代码可能很棘手。我的建议是:

  1. 查找可以由多个线程同时调用的任何代码。
  2. 添加日志记录语句,包括 Thread.currentThread().getName()(如果它还不是您正在使用的日志记录 API 的一部分)。
  3. 查看两个线程的交错,这应该能让您了解数据可能在何处损坏。

如果您在找到可以同时由多个线程运行并影响您的数据的代码后正在寻找“简单的解决方案”,只需使该方法同步,但这可能会破坏您在添加时试图实现的目标线程。

关于java - 项目在 Eclipse 中工作,但导出时不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3007878/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com