- - PR -
スレッドの中止について
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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-22 21:46
zの処理が終わった時点でflag=trueとして、
スレッドを開始したあとで while (thread.IsAlive) { if (flag) { thread.Abort(); } } とフラグがたったらアボートってな感じでいかがでしょう? | ||||
|
投稿日時: 2003-06-22 22:23
上のをそのまま使ったところ、whileのほうが強いらしく
無限ループに陥ってしまいました。 そこで、上のをスレッド化して使用したところ、 うまくいきました。 ありがとうございました。 | ||||
|
投稿日時: 2003-06-22 22:31
ちなみにwhileループの中で
Application.DoEvents() だと回避できないでしょうか? | ||||
|
投稿日時: 2003-06-22 23:29
while (thread.IsAlive) { if (flag) { thread.Abort(); } } このflagの定義に、volatile をつけたらうまくいったりして。 ただ、while でタイミング待ちとかするよりは、abort される側で 調整した方がいいような気がします。 | ||||
|
投稿日時: 2003-06-23 00:15
kowkowkowさん、なちゃさん返信ありがとうございます。
両方で動作確認してみました。 kowkowkowさんのApplication.doEvents()を使用する方法で回避できましたが、 なちゃさんのvolatileを使う方法ではうまくいきませんでした。(無限ループ??) どちらのほうも勉強不足のため仕組みが良くわかりませんが、 doEvetnts()とThread化するのはどちらがいいのでしょうか、 なんとなくThreadがたくさんあると良くないような気がするので、 doEvents()を使おうと思っています。 | ||||
|
投稿日時: 2003-06-23 01:37
ごめんなさい、コードをうまく推測できてないまま書いてしまいました。 forループの最初でflagをリセットして、zの処理が終わってからflagをセットする という感じですか? そうだとすると、ようはflagがセットされてからリセットされるまでの間に たまたまスレッドが切り替わらないからと思われます。 #思われますが、たまには止まる気もします… DoEventsするとそのタイミングでスレッドが切り替わるからうまくいくのだと思います。 私が書いたvolatileはちょっと想定する状況が違ったのでした。m(_ _)m ちなみに個人的には、元のスレッドの方で終了通知用のフラグをセットして、 処理スレッドの方では止めてもよいタイミングでフラグをチェックして終了する とかの方が良いんじゃないかな〜とも思います。 タイミングがシビアじゃなければ問題ないかな…ちょっと自信ありません。m(_ _)m |
1