1,マルチスレッド |
2,アニメーション |
「マルチスレッド」は「マルチタスク」と違います。
WindowsやUNIXなどは「マルチタスクOS」と呼ばれます。
これは、複数の独立したプログラムを実行できるというものです。
それに対して「マルチスレッド」は1つのプログラム内で同時に複数の
スレッドを実行できるというものです。
このスレッドは1つのプログラムとして完成したものではなく、プログラムの一部分です。
プログラムの一部分なので単独で実行はできません。
マルチスレッドにするのは簡単です。
Javaアプレットウィザードで以下のような項目がありました。
この「アプレットをマルチスレッドにしますか?」をyesにします。
また、「アニメーションをサポートしますか?」はNoにします。
ここだけを変更し、コンパイルしてみるとマルチスレッドのプログラムが完成します。
実行すると一定時間ごとに乱数が表示されます。
このプログラムは次のようになっています。
import java.applet.*; import java.awt.*; public class namae extends Applet implements Runnable { private Thread m_namae = null; public namae() { } public String getAppletInfo() { return "名前: namae\r\n" + "著作者: 小林成徳\r\n" + "Microsoft Visual J++ Version 1.1 で作成されました"; } public void init() { resize(320, 240); } public void destroy() { } public void paint(Graphics g) { g.drawString("実行中: " + Math.random(), 10, 20); } public void start() { if (m_namae == null) { m_namae = new Thread(this); m_namae.start(); } } public void stop() { if (m_namae != null) { m_namae.stop(); m_namae = null; } } public void run() { while (true) { try { repaint(); Thread.sleep(50); } catch (InterruptedException e) { stop(); } } } }
まず、Theadクラスのm_namaeを定義しています。
startでm_namaeに実体がないとき実体を与え、superクラスのstartを読み出しています。
runで50msごとにrepaintしています。
stopでm_nameに実体があるとき、superクラスのstopを読み出した後に
実体をnullにしています。
paintでは乱数を表示します。
sleepはThreadクラス内にあるのでThead.sleepで読み出します。
この間はコンピュータには負担がかかっていません。
(カーネルプロセッサーの使用率をみると0〜2%程度)
ただ、これは例外を発生する可能性があるのでその対策もします。
こうするとrunメッソド内は永久ループなので永遠に繰り返すことになります。
しかし、マウスイベントの受付もすることができます。
これが「マルチスレッド」というものです。
スレッドにはresumeやsuspendという命令があります。
suspendは一時停止、resumeは再会という意味があります。
先ほどの文に次のメソッドを加えてください。
アプレット上でクリックすると乱数表示の停止/再開ができます。
boolean check=true; public boolean mouseDown(Event evt,int x,int y){ check=!check; if (check) m_namae.resume(); else m_namae.suspend(); return true; }
アニメーションにするのも簡単です。
Javaアプレットウィザードで以下のような項目がありました。
この「アプレットをマルチスレッドにしますか?」をyesにします。
また、「アニメーションをサポートしますか?」もyesにします。
ここだけを変更し、コンパイルしてみると地球が回転するアプレットが
作れます。なお、このイメージファイルはimageディレクトリ内にあります。
実際のアニメーションづくりはこれを改良するのがもっとも手っ取り早い方法です。
クラスの最初の方に次のような変数(オブジェクト)が定義されています。
private Thread m_namae = null; private Graphics m_Graphics; private Image m_Images[]; private int m_nCurrImage; private int m_nImgWidth = 0; private int m_nImgHeight = 0; private boolean m_fAllLoaded = false; private final int NUM_IMAGES = 18;
このうちm_namae,m_Graphics,m_Images[],m_nCurrImage,m_fAllLoaded
m_nImgWidthとm_nImgHeightは手を付けません。
NUM_IMAGESはアニメーションの全部のコマ数です。(デフォルトでは18)
表示するGIFファイルには注意が必要です。
まず、全てのGIFイメージの幅と高さは同じである必要があります。
また、ファイル名は「img0001.gif」,「img0002.gif」,「img003.gif」・・・
にする必要があります。
もし、gifアイルをおくディレクトリを変更したかったり、ファイル名を
変更したい場合はrunメソッドの次の部分に手を加えます。
for (int i = 1; i <= NUM_IMAGES; i++){ strImage = "images/img00" + ((i < 10) ? "0" : "") + i + ".gif"; ・ ・ }
このファイル名の規則を変更すればいいわけです。
C++のPageに戻る