C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: 【C#】スレッドの再起動の仕方


(過去ログ 15 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■5025 / inTopicNo.1)  【C#】スレッドの再起動の仕方
  
□投稿者/ えう (1回)-(2007/07/03(Tue) 00:46:24)

分類:[C# (Windows)] 

2007/07/03(Tue) 00:48:52 編集(投稿者)
作成環境
WIN XP
VC#2005 Standard

よろしくお願いします。
C#でマルチスレッドによるプログラムを行っています。

やりたいことは以下のようなものになります。
 ・button1クリックで別スレッド(処理時間大)の立ち上げ
   ↓
 ・button2クリックで上で立ち上げたスレッドの中止
   ↓
 ・button1クリックで上のスレッドを最初から再起動


以下にサンプルプログラムを挙げます。

    public partial class Form1 : Form
    {
        //何度も利用したいスレッド
        Thread threadA = new Thread(new ThreadStart(ThreadMethod));

        public Form1()
        {
            InitializeComponent();
        }

        //別スレッド呼び出しボタン
        private void button1_Click(object sender, EventArgs e)
        {
            threadA.Start();
        }

        //別スレッド停止ボタン
        private void button2_Click(object sender, EventArgs e)
        {
            if (threadA.IsAlive == true)
            {
                threadA.Abort();
                threadA.Join();
            }
        }

        //別スレッド
        private static void ThreadMethod()
        {
            Thread.Sleep(50000);
        }
    }

これだと2回目の起動がうまくいきません。

実際には別スレッドはbutton1だけではなくていろいろなコントロールから立ち上げたいのですが、
簡単にすると以上のようなものになります。割り込み処理のようなものになります。

なにぶんプログラミングもC#も初心者なものでいい考えが浮かびません。
このような動作を実装するのにいい方法はあるのでしょうか。

ご教授よろしくお願いします。

引用返信 編集キー/
■5026 / inTopicNo.2)  Re[1]: 【C#】スレッドの再起動の仕方
□投稿者/ Hongliang (150回)-(2007/07/03(Tue) 03:41:10)
Hongliang さんの Web サイト
いったん中断してその後中断したところから再開するならともかく、最初からやり直すのであれば Thread を作り直しても何の問題もないと思いますが。
Thread を使いまわそうとはあんまり考えない方がいいです。使い捨てる感覚で。
引用返信 編集キー/
■5029 / inTopicNo.3)  Re[2]: 【C#】スレッドの再起動の仕方
□投稿者/ えう (2回)-(2007/07/03(Tue) 10:11:50)
No5026 (Hongliang さん) に返信

Hongliangさん、早速の回答ありがとうございます。

> いったん中断してその後中断したところから再開するならともかく、最初からやり直すのであれば Thread を作り直しても何の問題もないと思いますが。
> Thread を使いまわそうとはあんまり考えない方がいいです。使い捨てる感覚で。

  そのようにした場合、例えば以下のようにbutton1でスレッド呼び出したものを
 button2でスレッドがあるかどうか調べて、
 スレッドがあったら停止する場合、どのようにして確認するのでしょうか。

  以下だとbutton1_Clickメソッド内部でthreadAを作成しているので
 button2_Clickではスレッドを発見できません。

  何か実行中のスレッドを見つけて停止する方法があるのでしょうか。
 探してもいい方法がみつかりません。


        //別スレッド呼び出しボタン
        private void button1_Click(object sender, EventArgs e)
        {
            //何度も利用したいスレッド
            Thread threadA = new Thread(new ThreadStart(ThreadMethod));

            threadA.Start();
        }

        //別スレッド停止ボタン
        private void button2_Click(object sender, EventArgs e)
        {
            //ここがよく分かりません。
            if (threadA.IsAlive == true)
            {
                threadA.Abort();
                threadA.Join();
            }
        }

        //別スレッド
        private static void ThreadMethod()
        {
            Test();
        }

よろしくお願いします。

引用返信 編集キー/
■5030 / inTopicNo.4)  Re[1]: 【C#】スレッドの再起動の仕方
□投稿者/ Pandora (32回)-(2007/07/03(Tue) 10:27:06)
public partial class Form1 : Form
{
//何度も利用したいスレッド
Thread threadA = null;

//別スレッド呼び出しボタン
private void button1_Click(object sender, EventArgs e)
{
//何度も利用したいスレッド
threadA = new Thread(new ThreadStart(ThreadMethod));
threadA.Start();
}

 これで、できませんか?

引用返信 編集キー/
■5031 / inTopicNo.5)  Re[2]: 【C#】スレッドの再起動の仕方
□投稿者/ Hongliang (151回)-(2007/07/03(Tue) 10:49:05)
Hongliang さんの Web サイト
そもそも Thread を Abort しちゃうのも好ましくないとされています。ワーカスレッドでの終了処理ができませんから。
// 後で追加しようとしてもできない。
ワーカスレッドとの通信用のオブジェクトを用意し、止めたい場合はそのオブジェクトに止まれと言う。
ワーカスレッド側は定期的にそのオブジェクトを調べ、止まれフラグがたっていれば自分の処理を穏健に終わらせる。
と言うのが良くある手法です。メインスレッドは通信用オブジェクトさえ知ってれば良くなります。

更に言うなら、直接 Thread を使うんではなく BackgroundWorker を使えば至れり尽くせりな環境を整えてくれます。
引用返信 編集キー/
■5082 / inTopicNo.6)  Re[1]: 【C#】スレッドの再起動の仕方
□投稿者/ えう (3回)-(2007/07/03(Tue) 20:00:27)
2007/07/03(Tue) 20:00:42 編集(投稿者)

Pandoraさん、Hongliangさん回答ありがとうございます

>Pandoraさん

 教えていただいた方法で動作確認できました。
本当に基本的なことなのに気づかないとはお恥ずかしいです。


>Hongliangさん

 ワーカスレッドとの通信用のオブジェクトとBackgroundWorkerの2件
どちらも試してみました。BackgroundWorkerは本当に至れり尽くせりな感じですね。


お二人のおかげで何とか作業を進めることができました。
これを手がかりに、今後さらに詳しくこの関係の知識を深めていきます。
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -