別のスレッドでの計算の実行に関連する私のやや初心者の質問は申し訳ありませんが、私はC++のプログラマーです。別のスレッドと呼び出し可能なスレッドと実行可能なスレッドとmulitasking
大きな画像を処理するには計算コストが高いタスクがあります。処理中に私は自分のソフトウェア(ズーム操作を含む)で作業できるようにしたいと考えています。あなたのadviceに基づいて
(手順では、データを返す - 新しいイメージ)呼び出し可能インターフェースが使用されている :
public class B implements Callable<BufferedImage> {
private boolean c;
public B (boolean c) { this.c = c; }
public BufferedImage call() {
//Some operations
if (!c)
return null;
return new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
}
}
は当初、エグゼキュータのサービスが作成されます。
ExecutorService exe = Executors.newFixedThreadPool(2);
B b = new B(true);
をその後、将来は返されます:
Future<BufferedImage> res = exe.submit(b);
最後に、データを待っています:
BufferedImage img = res.get();
残念ながら、この実装は予期したとおりに動作しません。それは別のスレッドで動作しますが、「応答」はメインウィンドウに返されず、の計算中にソフトウェアを正しく使用することができません。
。したがって、私は
try
{
BufferedImage img_proj = results.get(5, TimeUnit.MILLISECONDS);
}
catch (Exception e)
{
results.cancel(true);
e.printStackTrace();
}
ように、get()メソッドを変更しようとしたが、TimeoutExceptionが表示されます。 ...
Thread t = new Thread(b);
t.start();
と予想されるようにマルチタスク作品で
public class B implements Runnable{
private boolean c;
private Runnable f;
public B (boolean c_, Runnable f_) { c = c_; f = f_;}
public BufferedImage process() {
//Some operations
BufferedImage output = null;
if (c) output = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
return output;
}
public void run() { process();}
}
一緒に戻って、Runnableインタフェースを使用してコードを書き換え
だから、私の質問は:それは「調整」またはする必要がありますさらにCallableインターフェイスを調整してください。もしそうなら、どのように?
@ matt:ありがとうございます。ここで何を意味するのですか?私のコードでは、Future resはサブミットプロシージャの結果を表しています.... –
justik
はい、正確にあなたの例のresです。単にres.get()を呼び出すのではなく、あなたのエグゼキュータにタスクとしてres.getを送信してください。 – matt
@ matt:これは素晴らしいことです...私の現在のコードをほとんど変更することなく。ありがとう。 – justik