- PR -

スレッドの中止について

1
投稿者投稿内容
knights
会議室デビュー日: 2003/03/16
投稿数: 8
投稿日時: 2003-06-22 18:19
はじめまして、質問させて頂きます。
よろしくお願いします。

早速ですが、C#.Netで
Thread.Start()しているスレッドをThread.Abort()で中止するとき
ある一定の場所で中止することはできませんか?

例えば、
for文のzの処理が終わったところでThread.Abort()を実行する方法はないでしょうか?

Thread thread;

public void sample(){
 int x = 0;
 int y = 0;
 int z = 0;
 for(int i=0; i<1000;i++){
  x += i;
  y = i*x;
  z = x*y;
 }
}
public void ThreadStart(){
 thread = new Thread(new ThreadStart(sample));
 thread.Start();
}
public void ThreadAbort(){
 thread.Abort();
}

どうか、よろしくお願いします。
ふぐ
会議室デビュー日: 2003/06/09
投稿数: 7
投稿日時: 2003-06-22 21:46
zの処理が終わった時点でflag=trueとして、
スレッドを開始したあとで
while (thread.IsAlive)
{
 if (flag)
 {
  thread.Abort();
 }
}
とフラグがたったらアボートってな感じでいかがでしょう?
knights
会議室デビュー日: 2003/03/16
投稿数: 8
投稿日時: 2003-06-22 22:23
上のをそのまま使ったところ、whileのほうが強いらしく
無限ループに陥ってしまいました。
そこで、上のをスレッド化して使用したところ、
うまくいきました。
ありがとうございました。
ふぐ
会議室デビュー日: 2003/06/09
投稿数: 7
投稿日時: 2003-06-22 22:31
ちなみにwhileループの中で
Application.DoEvents()
だと回避できないでしょうか?
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-06-22 23:29
引用:

knightsさんの書き込み (2003-06-22 22:23) より:
上のをそのまま使ったところ、whileのほうが強いらしく
無限ループに陥ってしまいました。


while (thread.IsAlive)
{
 if (flag)
 {
  thread.Abort();
 }
}

このflagの定義に、volatile をつけたらうまくいったりして。

ただ、while でタイミング待ちとかするよりは、abort される側で
調整した方がいいような気がします。
knights
会議室デビュー日: 2003/03/16
投稿数: 8
投稿日時: 2003-06-23 00:15
kowkowkowさん、なちゃさん返信ありがとうございます。
両方で動作確認してみました。

kowkowkowさんのApplication.doEvents()を使用する方法で回避できましたが、
なちゃさんのvolatileを使う方法ではうまくいきませんでした。(無限ループ??)

どちらのほうも勉強不足のため仕組みが良くわかりませんが、
doEvetnts()とThread化するのはどちらがいいのでしょうか、
なんとなくThreadがたくさんあると良くないような気がするので、
doEvents()を使おうと思っています。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-06-23 01:37
引用:

kowkowkowさんのApplication.doEvents()を使用する方法で回避できましたが、
なちゃさんのvolatileを使う方法ではうまくいきませんでした。(無限ループ??)

どちらのほうも勉強不足のため仕組みが良くわかりませんが、
doEvetnts()とThread化するのはどちらがいいのでしょうか、
なんとなくThreadがたくさんあると良くないような気がするので、
doEvents()を使おうと思っています。


ごめんなさい、コードをうまく推測できてないまま書いてしまいました。

forループの最初でflagをリセットして、zの処理が終わってからflagをセットする
という感じですか?
そうだとすると、ようはflagがセットされてからリセットされるまでの間に
たまたまスレッドが切り替わらないからと思われます。
#思われますが、たまには止まる気もします…
DoEventsするとそのタイミングでスレッドが切り替わるからうまくいくのだと思います。

私が書いたvolatileはちょっと想定する状況が違ったのでした。m(_ _)m

ちなみに個人的には、元のスレッドの方で終了通知用のフラグをセットして、
処理スレッドの方では止めてもよいタイミングでフラグをチェックして終了する
とかの方が良いんじゃないかな〜とも思います。

タイミングがシビアじゃなければ問題ないかな…ちょっと自信ありません。m(_ _)m
1

スキルアップ/キャリアアップ(JOB@IT)