• ベストアンサー

スレッドに関して

スレッドを開始してボタンでSTOPさせたいのですがストップしません スレッド状態ではACTIONイベントは発生しないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#25358
noname#25358
回答No.2

 あ、申し訳ない(^_^;  ブリッジ関数というのは、特にそういう関数が存在するわけではなく、ここでは「2つのクラスを結ぶための介在用関数」というかなりアバウトな意味に使っています。  たとえば、 Class Child { int flag = 0; void Run() { wwwwww // ここに子スレッド処理 if ( flag == 1 ) { return; } } void bridge() { flag = 1; } } Class Perent { void main { child a; kick(a); // この関数内で子スレッドをキックしていると思いねぇ wwwwwwww // ここで色々な処理 a.bridge(); // ※ } }  よけいな物を省いているのでちょっと分かりづらいですが、このようにしておけば、親スレッドの※の部分でブリッジ関数を呼び出せば、子スレッドの関数Run内で変数flagの判定が入った瞬間に子スレッドは終了するわけです。 (もちろんクラスが2つに分かれていなければ、ブリッジ関数ではなくフラグ用変数だけを使って短絡的に処理してしまえます)  もっとも、もっと高度な「こんな方法があったのかぁ!」みたいなテクニックとかがあるのかも知れませんが、一番わかりやすいのはこの方法ではないかと思います。

noname#35475
質問者

補足

deagleさん 度重なるご回答ありがとうございます。 さらなる質問で恐縮ですが マウスイベントとの関連がわかりません a.bridge(); // ※ のコールはどの時点でしょうか? スレッドの中止方法は理解できます。 スレッドを中止したらマウスイベントは発生するのでしょうか? スレッド中マウスイベンドについても終了させたい。 もう少しアドバイスをお願いします。

その他の回答 (2)

noname#25358
noname#25358
回答No.3

 補足みました。  下記に説明した方法ではマウスイベントは何も起こりませんし、また無効になったりもしません。つまり、こちら側で処理を起こしてあげなくてはいけないのです。  たとえば、ボタンを押した瞬間に子スレッドを中止し、その後そのボタンを無効にするという場合には、  1.addActionListenerで追加した関数actionPerformed内でブリッジ関数を呼ぶ。  2.ブリッジ関数を実行した直後にremoveActionListenerを呼ぶ。 という手順を踏みます。 関数removeActionListenerは、addActionListenerで設定したイベントを無効にします。 たとえば、 Class Perent extends Applet implements ActionListener { child a; // 子スレッドをここで作る Button b1; void init() { b1 = new Button("押せ!"); b1.addActionListener(this); // クラスPerentをリスナーとする kick(); // ここで子スレッドをキックしていると思いねぇ } void actionPerformed(ActionEvent e) { wwwwww // 色々な処理 a.bridge(); // ブリッジ呼び出し b1.removeActionListener(this); // と同時にイベント終了 } } このようにしておけば、ブリッジ関数を呼び出した直後にイベントが中止されます。 まあ、下記の説明と同様に、少々短絡的ではありますが……(笑) なおアクションリスナーの位置によっては、親スレッドではなく、ブリッジ関数内でremoveActionListenerを呼ぶこともあるかも知れません。それは、addActionListenerを実行したクラスと同じクラスになります。 それから、removeActionListenerの説明については、Sunのページからドキュメントをダウンロードしてください。 ……ところで(^_^; 回答は的を得ていましたでしょうか(^^;゚。(←かなり不安)

参考URL:
http://java.sun.com/products/jdk/1.2/ja/download-ja-docs.html
noname#25358
noname#25358
回答No.1

 これは単にテクニックの問題になってくると思うのですが、一番手っ取り早いのは、Threadをextendsしたクラス内に、終了指示を探知するブリッジ関数を作り、それを親スレッドから呼び出してやることだと思います。あとは、そのブリッジ関数が呼ばれたら子スレッドは終了する、というように。  どうでしょう?(^_^;

noname#35475
質問者

補足

deagleさん いつもありがとうございます。 ブリッジ関数の使用方法がわかりません ブリッジ関数とは???

関連するQ&A