none
C#轉換VB問題 RRS feed

  • 問題

  • http://blog.csdn.net/Damon_King/archive/2007/11/23/1899191.aspx
    這裡我把他轉VB.NET
    但是出現錯誤
    要怎麼改

    轉換如下
    For i As Integer = 0 To matchCollection.Count - 1
        'Start new thread
        thread = New System.Threading.Thread(New System.Threading.ParameterizedThreadStart(ThreadMethod))
        thread.Start(remotingUrl)
        threadList.Add(thread)
    Next
    For Each Thread As System.Threading.Thread In threadList
        Thread.Join()
    Next


    主要是這個threadList
    VB.NET要怎麼宣告呢?
    2009年5月15日 下午 02:05

解答

  • 這個錯誤訊息表示,Each 迴圈不支援動態刪除,改為 Index 迴圈即可。

    For i As Integer = threadList.Count - 1 To 0 Step -1
        If threadList(i).ThreadState = Threading.ThreadState.Stopped Then threadList.Remove(threadList(i))
    Next

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    • 已標示為解答 ahwa1 2009年5月17日 下午 01:00
    2009年5月17日 上午 03:13

所有回覆

  • 沒看到宣告也不知道,有可能是用 List(Of T) 來宣告。

    在 VB 可以直接用 Collection ,當然也可以用陣列。

    不過基本上用不太到這段程式碼,這段程式碼會造成主執行緒被封鎖到所有執行續跑完。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年5月15日 下午 02:58
  •     


























    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i As Integer Dim strUrl As String For i = 0 To ListBox1.Items.Count - 1 Dim newThread As System.Threading.Thread strUrl = ListBox1.Items(i).ToString() newThread = New Thread(New ParameterizedThreadStart(AddressOf WebReq)) newThread.Start(strUrl) Application.DoEvents() Msgbox ("OK全部完畢可以繼續下一個事件") Next End Sub Private Sub WebReq(ByVal State As Object) Dim strUrl As String strUrl = CType(State, String) Dim HttpWReq As HttpWebRequest = DirectCast(WebRequest.Create(strUrl), HttpWebRequest) Dim Cookie As New CookieContainer HttpWReq.Method = "GET" HttpWReq.ContentType = "application/x-www-form-urlencoded" HttpWReq.CookieContainer = Cookie Application.DoEvents() Dim strHtml As String Try Dim HttpWResp As HttpWebResponse = DirectCast(HttpWReq.GetResponse(), HttpWebResponse) Dim stm As Stream = HttpWResp.GetResponseStream() Dim encode As Encoding = System.Text.Encoding.GetEncoding("UTF-8") Dim readStream As New StreamReader(stm, encode) strHtml = readStream.ReadToEnd() HttpWResp.Close() Catch err As Exception strHtml = err.Message End Try Msgbox (strHtml) End Sub


















    我要怎麼等待全部的線程都把strHtml抓回來了才繼續下個動作呢
    也就是我的線程都抓回秀出Msgbox (strHtml)
    完畢了在秀出Msgbox ("OK全部完畢可以繼續下一個事件")

    這裡我做測試所以用Msgbox ("OK全部完畢可以繼續下一個事件")來當下個動作
    不過現在的是每個線都發Msgbox ("OK全部完畢可以繼續下一個事件")
    這裡要怎麼改呢?
    2009年5月15日 下午 03:10
  • 很多方法啊~ 看你怎樣規劃。

    比如說放一個 Timer ,定時掃描那個 ThreadList :
    For Each Thread As System.Threading.Thread In threadList
        If Thread.ThreadState = Threading.ThreadState.Stopped Then threadList.Remove(Thread)
    Next
    If threadList.Count = 0 Then Msgbox ("OK全部完畢可以繼續下一個事件")

    這樣主執行緒還可以加新執行緒進去,變成雙向彈性,主執行緒也可以沒事去更新一下畫面,讓使用者掌握目前的狀況。

    我記得微軟下載中心 VB 101 sample 裡面有個 MultiThread 就是這樣的範例,按鈕可以一直按,每按一個加一個對話框跑百分比跑完自動關閉,畫面上有執行緒的統計。

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年5月15日 下午 03:32
  • 可是這個
    For Each Thread As System.Threading.Thread In threadList
        If Thread.ThreadState = Threading.ThreadState.Stopped Then threadList.Remove(Thread)
    Next
    If threadList.Count = 0 Then Msgbox ("OK全部完畢可以繼續下一個事件")

    threadList還是出現未宣告??
    2009年5月15日 下午 03:50
  • 我下載了VB 101範例沒有這個MultiThread的專案耶
    怎麼辦
    2009年5月15日 下午 03:53
  • ... 在不同程序中使用變數應該變更宣告到共用區,如果你這點概念都沒有的話,現在玩多緒對你來說太早了,多緒要共用的更多。

    VB 101 範例應該要看這個:
    VB101SamplesBCL2\WorkingWithThreads

    VB2008 範例在:
    C:\Program Files\Microsoft Visual Studio 9.0\Samples\1028\VBSamples.zip
    解壓縮後:
    Application Samples\ThreadUIUpdate (這個範例會在畫面上更新目前執行緒的數量)
    Application Samples\Multithread (示範三種不同的多緒方式,以進度列方式展示)

    這兩個範例合在一起才是我說的東西。

    Multithread:
    http://msdn.microsoft.com/zh-tw/library/9szee8tb(VS.80).aspx

    VB 2008 的 sample 也可在此下載:
    http://code.msdn.microsoft.com/Release/ProjectReleases.aspx?ProjectName=vbsamples&ReleaseId=1426
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年5月15日 下午 04:29
  • 我去下看看
    2009年5月15日 下午 04:33
  • Multithread這個專案有三個按鈕
    第一個要他執行完畢才可以在按
    第二個有錯誤我點第二次就出現錯的
    第三個按鈕可以一直點每個窗體都會自動結束調

    那我要研究哪個按鈕呢比較適合我現在的
    可以提是一下嗎
    我想一個專案會很久
    可以提示要往哪個按鈕延伸我現在的嗎?
    2009年5月15日 下午 04:51
  • 1. 你的編譯器版本
    2. 你現在還有啥問題你自己要先明確寫出來。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年5月15日 下午 05:08
  • 我是VS 2008的
    編譯VB.NET
    目前還想不出來

    For Each Thread As System.Threading.Thread In threadList
        If Thread.ThreadState = Threading.ThreadState.Stopped Then threadList.Remove(Thread)
    Next
    If threadList.Count = 0 Then Msgbox ("OK全部完畢可以繼續下一個事件")

    threadList這個宣告

    我把它用宣告這樣
    Dim threadList As List(Of T)
    也是發生錯誤??
    就不知道怎麼宣告
    2009年5月15日 下午 05:23
  • 試試這樣宣告
    Dim threadList As New List(Of System.Threading.Thread)
    2009年5月15日 下午 05:51
    版主
  • 我試看看
    2009年5月15日 下午 06:14
  • 可以了
    不過還是不會在全部都完畢才出現點下按鈕一他就直接出現
    我的代碼是這樣

    Imports System.Threading
    Imports System.Net
    Imports System.Text
    Imports System.IO
    Imports System.Text.RegularExpressions

    Public Class Form1
        Dim newThread As System.Threading.Thread
        Delegate Sub textDo(ByVal text As String)
        Dim mytext As New textDo(AddressOf tbox)
        Dim threadList As New List(Of System.Threading.Thread)

        Private Sub tbox(ByVal text As String)
            TextBox1.Text = text
        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim i As Integer
            Dim strUrl As String
            For i = 0 To ListBox1.Items.Count - 1
                Dim newThread As System.Threading.Thread
                strUrl = ListBox1.Items(i).ToString()
                newThread = New Thread(New ParameterizedThreadStart(AddressOf WebReq))
                newThread.Start(strUrl)

            Next
            For Each Thread As System.Threading.Thread In threadList
                If Thread.ThreadState = Threading.ThreadState.Stopped Then threadList.Remove(Thread)
            Next
            If threadList.Count = 0 Then MsgBox("OK全部完畢可以繼續下一個事件")


        End Sub

        Private Sub WebReq(ByVal State As Object)
            Dim strUrl As String
            strUrl = CType(State, String)
            Dim HttpWReq As HttpWebRequest = DirectCast(WebRequest.Create(strUrl), HttpWebRequest)
            Dim Cookie As New CookieContainer
            HttpWReq.Method = "GET"
            HttpWReq.ContentType = "application/x-www-form-urlencoded"
            HttpWReq.CookieContainer = Cookie
            Application.DoEvents()
            Dim strHtml As String
            Try
                Dim HttpWResp As HttpWebResponse = DirectCast(HttpWReq.GetResponse(), HttpWebResponse)
                Dim stm As Stream = HttpWResp.GetResponseStream()
                Dim encode As Encoding = System.Text.Encoding.GetEncoding("BIG5")
                Dim readStream As New StreamReader(stm, encode)
                strHtml = readStream.ReadToEnd()
                HttpWResp.Close()
            Catch err As Exception
                strHtml = err.Message
            End Try
            TextBox1.Invoke(mytext, New Object() {strHtml})
        End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim FSO As Object
            Dim FSO_File As Object
            FSO = CreateObject("Scripting.FileSystemObject")
            FSO_File = FSO.OpenTextFile(Application.StartupPath & "\url.txt")
            Do While Not FSO_File.AtEndOfStream
                ListBox1.Items.Add(FSO_File.ReadLine)
            Loop
            FSO_File.Close()
        End Sub

    End Class

    2009年5月15日 下午 06:19
  • 比如說放一個 Timer ,定時掃描那個 ThreadList
    http://msdn.microsoft.com/zh-tw/library/h1c2h276.aspx
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年5月16日 上午 01:18
  • Imports System.Threading
    Imports System.Net
    Imports System.Text
    Imports System.IO
    Imports System.Text.RegularExpressions

    Public Class Form1
        Inherits Form
        Dim newThread As System.Threading.Thread
        Delegate Sub textDo(ByVal text As String)
        Dim mytext As New textDo(AddressOf tbox)
        Dim threadList As New List(Of System.Threading.Thread)

        Private Sub tbox(ByVal text As String)
            TextBox1.Text = text
        End Sub


        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim i As Integer
            Dim strUrl As String
            For i = 0 To ListBox1.Items.Count - 1
                Dim newThread As System.Threading.Thread
                strUrl = ListBox1.Items(i).ToString()
                newThread = New Thread(New ParameterizedThreadStart(AddressOf WebReq))
                newThread.Start(strUrl)
                Timer2.Enabled = True
                Timer2.Interval = 200
            Next
            If threadList.Count = 0 Then MsgBox("OK全部完畢可以繼續下一個事件")
        End Sub


        Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
            For Each Thread As System.Threading.Thread In threadList
                If Thread.ThreadState = Threading.ThreadState.Stopped Then threadList.Remove(Thread)
            Next
            Timer2.Enabled = False
        End Sub

        Private Sub WebReq(ByVal State As Object)
            Dim strUrl As String
            strUrl = CType(State, String)
            Dim HttpWReq As HttpWebRequest = DirectCast(WebRequest.Create(strUrl), HttpWebRequest)
            Dim Cookie As New CookieContainer
            HttpWReq.Method = "GET"
            HttpWReq.ContentType = "application/x-www-form-urlencoded"
            HttpWReq.CookieContainer = Cookie
            Application.DoEvents()
            Dim strHtml As String
            Try
                Dim HttpWResp As HttpWebResponse = DirectCast(HttpWReq.GetResponse(), HttpWebResponse)
                Dim stm As Stream = HttpWResp.GetResponseStream()
                Dim encode As Encoding = System.Text.Encoding.GetEncoding("BIG5")
                Dim readStream As New StreamReader(stm, encode)
                strHtml = readStream.ReadToEnd()
                HttpWResp.Close()
            Catch err As Exception
                strHtml = err.Message
            End Try
            TextBox1.Invoke(mytext, New Object() {strHtml})
        End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim FSO As Object
            Dim FSO_File As Object
            FSO = CreateObject("Scripting.FileSystemObject")
            FSO_File = FSO.OpenTextFile(Application.StartupPath & "\url.txt")
            Do While Not FSO_File.AtEndOfStream
                ListBox1.Items.Add(FSO_File.ReadLine)
            Loop
            FSO_File.Close()
        End Sub

    End Class


    還是不行??

    2009年5月16日 上午 01:59
  • 就放個程式碼給我看看吧
    我真的不行

    2009年5月16日 上午 09:53
  • 為什麼這句不在 Timer 內?
    If threadList.Count = 0 Then MsgBox("OK全部完畢可以繼續下一個事件")

    程式碼不是用來剪貼的,如果你沒看懂的話,你永遠不知道你在幹嘛。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年5月16日 上午 11:15
  •     Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
            For Each Thread As System.Threading.Thread In threadList
                If Thread.ThreadState = Threading.ThreadState.Stopped Then threadList.Remove(Thread)
            Next
            If threadList.Count = 0 Then MsgBox("OK全部完畢可以繼續下一個事件")
            Timer2.Enabled = False
        End Sub

    這個是每個線程完畢出現msgbox
    可是我要的是現程全部才讓msgbox出現一次
    2009年5月16日 下午 12:19
  • ...
    那 ThreadList.Count 何時會變為 0 ?

    所有執行緒跑完,ThreadList.Count 不會等於 0 ,而是所有跑完的執行緒都被移除參照後,ThreadList.Count 才會等於 0 。

    看程式碼要看邏輯,不是隨便跑跑測看看。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年5月16日 下午 01:56
  • 所有跑完的執行緒都被移除參照 = 0 這樣嗎

    "所有跑完的執行緒都被移除參照" 是只哪個英文代碼呢?
    System.Threading.Thread = 0 試了
    可是不成立
    2009年5月16日 下午 03:07
  • ...

    你先把你的程式開起來用工作管理員看。
    .Net 本身自己就會自動開好幾個執行緒,所以你程式的所有執行緒永遠不可能為 0 ,為 0 的話你現在的程式怎樣跑?

    你撿來的原始碼要用集合類別管新的執行緒就是這個原因。你只要管好你自己加入的執行緒即可。

    你如果搞不清楚哪個類別是幹嘛的,把 MSDN for Visual Studio 2008 灌起來慢慢看,我不建議買書,但我認為線上手冊一定要看,先在 Process / Thread 類別都翻過,至少知道哪個類別要幹嘛,否則你不該碰多緒。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年5月16日 下午 03:20
  • For Each newThread As System.Threading.Thread In threadList If newThread.ThreadState = Threading.ThreadState.Stopped Then threadList.Remove(newThread) Next 集合已修改; 列舉作業可能尚未執行。 改了自己的線"newThread" 就出現"集合已修改; 列舉作業可能尚未執行。" 大大你說的集合類是裡嗎?
    2009年5月16日 下午 03:28
  • 請用台灣地區的慣用語。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年5月16日 下午 03:47
  • For Each newThread As System.Threading.Thread In threadList If newThread.ThreadState = Threading.ThreadState.Stopped Then threadList.Remove(newThread) Next 集合已修改; 列舉作業可能尚未執行。 改了自己的線"newThread" 就出現"集合已修改; 列舉作業可能尚未執行。" 篩ㄟ你說的集合類是裡嗎?
    2009年5月16日 下午 03:49
  • ahwa1:
          心冷大所謂的用語,指的是請將 "線程" 改為"執行緒" .請記住在對岸才稱為"線程",本地用語為"執行緒" ,不是叫你把 "大大" 改成 "篩ㄟ" .       
         
    2009年5月16日 下午 04:22
    版主
  • 這個錯誤訊息表示,Each 迴圈不支援動態刪除,改為 Index 迴圈即可。

    For i As Integer = threadList.Count - 1 To 0 Step -1
        If threadList(i).ThreadState = Threading.ThreadState.Stopped Then threadList.Remove(threadList(i))
    Next

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    • 已標示為解答 ahwa1 2009年5月17日 下午 01:00
    2009年5月17日 上午 03:13
  •     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            'For Each Thread As System.Threading.Thread In threadList
            'If Thread.ThreadState = Threading.ThreadState.Stopped Then threadList.Remove(Thread)
            'Next
            '這個錯誤訊息表示,Each 迴圈不支援動態刪除,改為 Index 迴圈即可
            For i As Integer = threadList.Count - 1 To 0 Step -1
                If threadList(i).ThreadState = Threading.ThreadState.Stopped Then threadList.Remove(threadList(i))
            Next
            If threadList.Count = 0 Then MsgBox("OK全部完畢可以繼續下一個事件")
            Timer1.Enabled = False
        End Sub

    也是跟之前一樣
    不是都完畢了才出現一個"OK全部完畢可以繼續下一個事件"
    秒數調慢也一樣
    2009年5月17日 下午 12:26
  • 原來是少加了一個要給它的事情傳達事項
    threadList.Add(newThread)
    加在點按鈕那邊就可以了

    謝謝你了篩ㄟ(執行緒)
    2009年5月17日 下午 01:00