0

私がやっていることは、ユーザーのデスクトップのスクリーンショットを常に取得し、ユーザーが望む限り保存するプログラムを作成することです。最初に 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);
4

4 に答える 4

3

あなたはトラブルを求めていThreadpoolます。スレッド数を制限する実装を行う必要があります。使用方法については、公式チュートリアルを参照してください: http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html

あなたのソリューションのように:

do {    
    (new Thread(new Record())).start();
} while (!Record.stop);

ジョブを処理するよりも速くスレッドを作成します。基本的に、できるだけ早く多くのスレッドを作成すると言うだけで、新しいスレッドが作成されるまで処理されるスレッドの数は保証されません。したがって、プログラムが死ぬまでは時間の問題です (リソースが使い果たされる = CPU + メモリ)。

于 2013-08-18T18:18:48.250 に答える
1

ここでスレッド作成プロセスを制限する必要があります

(new Thread(new Record())).start(); 

これらのスレッドはほぼ一緒に開始され、メモリを肥大化させます。

于 2013-08-18T18:20:32.303 に答える