2012-04-03 2 views
0

okが私のコードです:マルチスレッド - ここに多くのスレッドを追加し、操作を続行

For i = 0 To 10 
     Dim tTemp As Threading.Thread = New Threading.Thread(AddressOf dwnld) 
     tTemp.IsBackground = True 
     'tTemp.Start(geturl) 
     lThreads.Add(tTemp) 
     'MsgBox(lThreads.Item(i).ThreadState) 
    Next 

私は10件のスレッドとスレッドのリストを作成し、それらに機能を割り当てて、プロパティと、リストに追加します。

'While ListBox2.Items.Count > 0 
    For i = 0 To lThreads.Count - 1 
     If (lThreads.Item(i).ThreadState = 12) Then 
      If (ListBox2.Items.Count > 0) Then 
       lThreads.Item(i).Start(geturl) 
       If (i = lThreads.Count - 1) Then 
        i = 0 
       End If 
      Else 
       Exit For 
      End If 
      'MsgBox(lThreads.Item(i).ThreadState) 
     ElseIf (lThreads.Item(i).ThreadState = 16) Then 
      lThreads.RemoveAt(i) 
      Dim tTemp As Threading.Thread = New Threading.Thread(AddressOf dwnld) 
      tTemp.IsBackground = True 
      lThreads.Add(tTemp) 
      If (i = lThreads.Count - 1) Then 
       i = 0 
      End If 
     End If 
    Next 

何が起こっているのかは、関数dwnldが完了した後にスレッドが停止することです。だから私は最初に状態をチェックします(12は背景を意味し、始動しません)。ケース12でスレッドを開始し、16(停止)の特定のスレッドを削除し、上記の10を追加するように別のスレッドを追加します。

また、iカウンタが最後の値に達したときにチェックがあり、i = 0を代入してループ全体を再起動します。

プログラムはいくつかのWebページをダウンロードし、urlはlistbox2から渡されます。 geturlはurlを渡してリストから削除します。したがって、リストボックスが空の場合、forループを終了します。

ただし、上記のコードは11回だけ実行されており、再起動しません。私はlableとgotoを使ってみましたが、単純にハングします。

誰に教えてもらえませんか?

私が望むのは、10個のスレッドを維持してWebページのダウンロードを維持し、リストが空の場合はその機能を終了することです。

答えて

2

独自のカスタムスレッドプールを手動で管理しようとするのはおそらく間違ったアプローチです。 ThreadPool.QueueUserWorkItem、または新しいTaskクラスを使用することをお勧めします。スレッドプーリングはあなたのために管理され、コードを大幅に簡素化します。このコードを完全に破棄し、先ほど触れた手法の1つを使用してやり直してください。これらのテクニックのいずれかを実装する際に問題が発生した場合は、より具体的な質問を投稿してください。

+0

ok私はそれらをチェックアウトします。私にこのことを知らせてくれてありがとう:) – xhammer

+0

@ xhammer:問題はありません。また、これらの新しいテクニックで問題が発生した場合は、もう一度別の質問を投稿してください。 –

1

スレッドのマイクロ管理は、まあまあ、本当に悪い考えです。私が絶え間なく作成、終了、破壊されたスレッドのリストを維持しようとしている誰かを見ると、私は彼らが破壊されていることを知っているだけです。私は経験豊富な専門家がそれをやろうとしているのを見てきました。それは数ヶ月後に不可能な壮大な失敗を待っているのが楽しみです。

スレッドプールは、通常、並べ替えには何もありません。それらは通常、タスクのプール(プロデューサ/コンシューマキューのタスククラスインスタンス)で、複数のスレッドが自由に作業を開始できるようになっています。作業スレッドは、古いもので終了したときに新しいタスクを自分自身で自動管理します。これは、より高度なマイクロ管理を必要としません。

@Brianの話を聞く - スレッドの管理リストを忘れて、スレッドの状態とそのすべてをチェックしてください。それはあなたを病気にするだけです。 ThreadPool.QUWIまたはTasksを実行します。

関連する問題