私がやっていることは、ユーザーのデスクトップのスクリーンショットを常に取得し、ユーザーが望む限り保存するプログラムを作成することです。最初に while メソッドでキャプチャするメソッドを呼び出しましたが、これは遅すぎたため、できるだけ多くの画像をできるだけ早く取得する必要があります。私がすることにしたのは、スレッドを使用することでした。
プログラムの実行中に PC が遅くなり (つまり、マウスの点滅、動きが遅くなるなど)、プログラムを停止すると、次のエラーが発生します。
Exception in thread "Thread-294" java.lang.OutOfMemoryError: Java heap space
at sun.awt.windows.WRobotPeer.getRGBPixels(Unknown Source)
at java.awt.Robot.createScreenCapture(Unknown Source)
at maple.Record.run(Record.java:29)
エラーが発生する行は次のとおりです。
img = r.createScreenCapture(new Rectangle (0, 0, width, height));
これがスレッドを含む私のクラスです。
import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.media.MediaLocator;
public class Record implements Runnable {
Robot r;
static int width = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
static int height = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
BufferedImage img;
public static boolean stop = false;
public void run() {
try {
r = new Robot();
img = r.createScreenCapture(new Rectangle (0, 0, width, height));
ImageIO.write(img, "png", new File(JavCapture.tmpLocation + "\\tmp\\" + System.currentTimeMillis() + ".png"));
} catch (IOException | AWTException e) { e.printStackTrace(); }
}
}
.png ファイルで動作するように編集された JpegImagesToMovies を呼び出すと、エラーが発生します。
詳細については、このリンクを参照してください。
この問題を解決するにはどうすればよいですか。また、PC の速度が低下しないように、スレッドのメモリ使用量を減らすにはどうすればよいでしょうか。
これが main メソッドの呼び出しです。
do {
(new Thread(new Record())).start();
} while (!Record.stop);