スレッド化

ボタンで絵が動くようにできたので、今度は勝手に動かしましょう。ボタンを押したときにcurrentの値を変えてましたが、自動的に変わるようにすれば良いです。AnimationSample01.javaになります。

自動的に変更するためにはスレッドを用います。色んな方法がありますがCanvasRunnableインタフェースを実装する方法を取りました。

まずCanvasを見ます。名前はAnimationCanvasに変更しました。クラス宣言で

class AnimationCanvas extends Canvas implements Runnable {

Runnableの実装を宣言します。必要なのはrunメソッドで

public void run() {
    while (true) {
        current++;
        if (current >= maxImage) current = 0;
        repaint();

        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
            break;
        }
    }
}

とボタンが押されていた操作をこのメソッドで実行させてます。

あとはAnimationSample01でスレッドを作成して実行させます。この操作はstartAppメソッドで実行することにしました。

public void startApp() {
    AnimationCanvas canvas = new AnimationCanvas(12);
    canvas.addCommand(exitCommand);
    canvas.setCommandListener(this);

    display.setCurrent(canvas);
    
    thread = new Thread(canvas);
    thread.start();
}

最後の二行

thread = new Thread(canvas);
thread.start();

がスレッドの作成と起動です。pauseApp()destroyApp()も変更しときます。

public void pauseApp() {
    thread = null;
}

public void destroyApp(boolean unconditional) {
    thread = null;
}

アプリケーションが停止・終了の状態になったときはスレッドを開放するようにしました。

他にも変更点がありますが、非本質的なので説明を省きます。では実行してみましょう。

D:\midp-fcs\segi>javac -bootclasspath /midp-fcs/classes AnimationSample01.java
D:\midp-fcs\segi>preverify -classpath .;/midp-fcs/classes AnimationSample01 AnimationCanvas
D:\midp-fcs\segi>cd output
D:\midp-fcs\segi\output>set SCREEN_DEPTH=8
D:\midp-fcs\segi\output>midp AnimationSample01
Classpath is not set. Defaulting to "."
Loading /images/01.png
Loading /images/02.png
Loading /images/03.png
Loading /images/04.png
Loading /images/05.png
Loading /images/06.png
Loading /images/07.png
Loading /images/08.png
Loading /images/09.png
Loading /images/10.png
Loading /images/11.png
Loading /images/12.png

下の画面が表示されて、勝手に画像が動きます。

画面イメージ


前の項目へ次の項目へ
「MIDPで遊ぼう!」のページへ
せぎてつ伝言板
このページの感想をどうぞ!
お名前(匿名OK):

メールアドレス:
最終更新日 : 2000年10月7日(土)
tetsu@segi.org