memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

ProcessingでThreadを使うサンプル

自分用メモです。

あるプログラムを参考に、Threadで処理を外だしして、その処理からProcessingの本体プログラムのメソッドをリフレクションを使って呼び出すサンプルを作ってみました。

Processingでたまに処理を並列化したいときがあります。そんなときに使えそうです。例えば、描画ループとネットワーク待ちループがあって、ネットワーク経由でデータを受信したときに、そのデータを受け取って表示するようなアプリです。

ThreadTest.pde

void method(int val)
{
  println("Hello" + val);  
}

void setup()
{
  A a = new A(this);
  a.start();
}

A.java

import processing.core.PApplet;
import java.lang.reflect.Method;

class A implements Runnable
{
  PApplet p55;
  private Method method = null;

  public A(PApplet p55)
  {
    this.p55 = p55;
    try 
    {
      method = p55.getClass().getMethod("method",  new Class[] { int.class } );
    } catch (Exception e) {
      p55.println("method() メソッドが定義されていません");
    }
  }
  
  private void triggerMethodEvent(int val) 
  {
    if (method != null) 
    {
      try 
      {
        method.invoke(p55, new Object[] { val } );
      } catch (Exception e) {
        p55.println("method()  を無効化します");
        e.printStackTrace();
        method = null;
      }
    }
  }

  public void start()
  {
    Thread th = new Thread(this);
    th.start();
  }
  
  public void run()
  {
    p55.println("スレッド開始");
    triggerMethodEvent(100);
  }
}