-PR-
解決
済み

スレッドに関して

  • 暇なときにでも
  • 質問No.3861
  • 閲覧数104
  • ありがとう数9
  • 気になる数0
  • 回答数3
  • コメント数0

スレッドを開始してボタンでSTOPさせたいのですがストップしません
スレッド状態ではACTIONイベントは発生しないのでしょうか?
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答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(); // ※
のコールはどの時点でしょうか?
スレッドの中止方法は理解できます。
スレッドを中止したらマウスイベントは発生するのでしょうか?
スレッド中マウスイベンドについても終了させたい。
もう少しアドバイスをお願いします。
投稿日時 - 0000-00-00 00:00:00
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1

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

deagleさん いつもありがとうございます。
ブリッジ関数の使用方法がわかりません
ブリッジ関数とは???
投稿日時 - 0000-00-00 00:00:00
  • 回答No.3

 補足みました。  下記に説明した方法ではマウスイベントは何も起こりませんし、また無効になったりもしません。つまり、こちら側で処理を起こしてあげなくてはいけないのです。  たとえば、ボタンを押した瞬間に子スレッドを中止し、その後そのボタンを無効にするという場合には、  1.addActionListenerで追加した関数actionPerformed内でブリッジ関数を呼ぶ。  2.ブリッジ関数を実 ...続きを読む
 補足みました。
 下記に説明した方法ではマウスイベントは何も起こりませんし、また無効になったりもしません。つまり、こちら側で処理を起こしてあげなくてはいけないのです。
 たとえば、ボタンを押した瞬間に子スレッドを中止し、その後そのボタンを無効にするという場合には、
 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のページからドキュメントをダウンロードしてください。

……ところで(^_^;
回答は的を得ていましたでしょうか(^^;゚。(←かなり不安)
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ