2009-06-19 16 views
2

データベースのレコード数に基づいてスレッドの配列を作成しています。その後、各スレッドはipaddressをポーリングしてから、しばらくスリープした後、再度ポールします。私は定期的にデータベースのホスト数の変化をチェックします。私は別のスレッドを開始するより多くのホストがある場合。ホストが少ない場合、そのホストを監視していた特定のスレッドを強制終了する必要があります。どのように私は特定のスレッドを殺すのですか?スレッドの配列から特定のスレッドを削除する方法

enter code here protected static void GetThreads() 
    { 
     Thread[] threads; 
     do 
     { 
      dt = getIP_Poll_status(); 
      threads = new Thread[dt.Rows.Count]; 
      Console.WriteLine(dt.Rows.Count + " Threads"); 
      for (int i = 0; i < threads.Length; ++i) 
      { 
       string ip = dt.Rows[i][0].ToString(); 
       int sleep = Convert.ToInt32(dt.Rows[i][1].ToString()); 
       string status = dt.Rows[i][2].ToString(); 
       string host = dt.Rows[i][3].ToString(); 
       Hosts.Add(host); 
       string port = dt.Rows[i][4].ToString(); 
       //Console.WriteLine("starting on " + ip + " delay " + sleep+".current status "+status); 
       threads[i] = new Thread(PollingThreadStart); 
       threads[i].Start(new MyThreadParameters(ip, sleep, status, host, port)); 
       threads[i].Name = host; 

      } 
      Thread.Sleep(50000); 
     } 

     while (true); 
    } 

答えて

1

あなたのスレッドのほとんどが何もしない自分の時間の大半を過ごすことになりますことを考えると、あなたのデザインが優れてIPアドレスのリストを保持し、単一のスレッドと、彼らがポーリングされることになっている時間として実現される可能性があります次。次のポーリング時間の順にソートしておきます。

擬似コード:

What time does the next ip address need to be polled? 
Sleep till then 
Poll the address. 
Update the poll time for that address to now + interval. 
Resort the list 
Repeat. 

あなたがDBの更新を持つたびに、リストを更新し、それを停止する必要があるときに再評価するためにスレッドを注文。

+0

もう少し詳しいことを教えてください。私がIPアドレスのリストを持っていれば、それぞれに関連付けられた投票時間があります。これはどのようにして1つのスレッドで行いますか? –

+0

あなたのスレッドは、どのIPをポーリングする必要があるか、どのくらいの頻度でポーリングする必要があるかを知っています。その時点でポーリングを行い、その後、どのIPをポーリングする必要があるのか​​、また、実行するまでどれくらいの時間を要するのかを調べます。 – PaulJWilliams

+0

与えられた日にあなたにはいくつかの仕事があると想像してください。 1pm車を洗う。 1.30買い物に行く2pmオーブンなどを回す あなたの方法は、家族を切り上げて、それぞれに仕事と時間を割り当てるのと同じです。問題は、ほとんどの人が何もせずに座っている時間を過ごすだけで、到着するのを待っていることです。私が概説した方法は、基本的には順番に仕事​​をしているのですが、それぞれの終わりには、次のことをする時間まで冷たいビールを足に入れるだけです。あなたも家に詰まった家を持っていない;) – PaulJWilliams

7

強制的にスレッドを強制終了することは悪い考えです。システムが不確定な状態になる可能性があります。

次回のチェック時にスレッドが適切に終了するように、スレッドセーフな方法でフラグを設定する必要があります。詳細とサンプルコードについては、my threading articleを参照してください。

私はSleepを使用して追加することは、ほとんどの場合、間違ったことです。あなたは、Monitor.Waitのような優雅な目覚ましを可能にするものを使用するべきです。そうすることで、ポーリングスレッドが死ぬなどの変更があったときに、スレッドが待機しているときに何かが起きる可能性があり、変更をすぐに認識することができます。

0

対象とする言語は指定しませんが、一般的には言語に関係なく同じ方法を使用します。実行を停止するときにスレッドに通知するために使用される共有変数を単純に使用します。スレッドは定期的に値をチェックし、設定されていれば正常に停止します。通常、これはスレッドを停止する唯一の安全な方法です。

+1

サンプルコードでは、これはC#であると仮定するのが公正だと思います。私は、OPが明示的にしなければならないということに同意する。 –

0

私が言う:

  1. スレッドを殺してはいけません。彼らに死ぬように、うまくやってほしい(イベントまたはいくつかの共通の旗を見て)。
  2. DBエントリごとに1つのスレッドを作成するときは注意してください。これは突然あなたが多くの行を持っている予期せぬDBの活動が、あまりにも多くのスレッドでOSを強制終了させるという意味になります。間違いなくスレッドの数に制限があります。
0

何をしようとしているがため、上記の理由の悪い考えです...

は、おそらくより良い、あなたが望むものを達成するための方法その他がありますが、それらはより複雑です。ただし、スレッドにホスト名となる名前を付けることはできます。名前を確認してスレッドを見つけることができます。

関連する問題