none
如何同時執行多個副程式 RRS feed

  • 問題

  • 問題一
    請問要同時執行多個副程式
    要如何做呢?
    問題二
    如果要將TIMER的值顯示在TEXTBOX上
    要如何做呢?
    2009年9月21日 上午 08:03

解答

  • 問題一
    請參考
    Visual Basic 中的多執行緒
    http://msdn.microsoft.com/zh-tw/library/eed6swsx(VS.80).aspx


    問題二
    您要將 TIMER 的什麼值顯示在 TextBox ??
    常見的做法

    Public Class Form1
        Dim temp As Integer
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Timer1.Interval = 1000
            Timer1.Enabled = True
            temp = 0
        End Sub

        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            temp = temp + 1
            TextBox1.Text = temp.ToString()
        End Sub
    End Class


    .NET菜鳥自救會 http://www.dotblogs.com.tw/chou/
    • 已標示為解答 maxcha 2009年9月24日 上午 05:09
    2009年9月21日 上午 08:22
    版主
  • Hi,

    A1
    若用Backgroundworker要同時執行幾個的話
    就要放幾個
    多執行緒的方法不只BackgroundWorker
    還有Thread、ThreadPool..可以參考

    A2
    要做碼表
    就是開始時記下起始時間
    Time_Click時把目前時間減去開始時間
    就可以了

    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 maxcha 2009年9月24日 上午 05:09
    2009年9月22日 上午 09:49

所有回覆

  • 問題一
    請參考
    Visual Basic 中的多執行緒
    http://msdn.microsoft.com/zh-tw/library/eed6swsx(VS.80).aspx


    問題二
    您要將 TIMER 的什麼值顯示在 TextBox ??
    常見的做法

    Public Class Form1
        Dim temp As Integer
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Timer1.Interval = 1000
            Timer1.Enabled = True
            temp = 0
        End Sub

        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            temp = temp + 1
            TextBox1.Text = temp.ToString()
        End Sub
    End Class


    .NET菜鳥自救會 http://www.dotblogs.com.tw/chou/
    • 已標示為解答 maxcha 2009年9月24日 上午 05:09
    2009年9月21日 上午 08:22
    版主
  • Q1.
    Public Sub MyFunc()
    
        MyFunc1()
        MyFunc2()
        ....
    
    End Sub
    Q2.

    在 Timer 的定時觸發事件 (Windows Forms 的 Timer 是 Tick 事件,System.Timers.Timer 的計時器則是 Elapsed 事件) 中撰寫程式去把 DateTime.Now.ToString() 的值設給 TextBox 即可。
    初學不是問題,但用不正確的態度來問問題,那就是很大的問題。
    如果只會用 "看" 的學程式,那不如早點改行,以免誤己一生...
    2009年9月21日 上午 08:22
    版主
  • 問題一
    請問如果我有10個副程式要同時執行
    是不是就要用10個BackgroundWorker

    問題二
    我想要做碼表功能
    所我想顯示TIMER的計時
    小歐版大寫的應該是計數的功能

    2009年9月22日 上午 07:57
  • 問題一
    小朱版主
    這方法並沒有同時執行多個副程式
    而是按照順序執行

    問題二
    這方法是顯示系統時間
    好像不是TIMER的計時的值
    2009年9月22日 上午 08:36
  • Hi,

    A1
    若用Backgroundworker要同時執行幾個的話
    就要放幾個
    多執行緒的方法不只BackgroundWorker
    還有Thread、ThreadPool..可以參考

    A2
    要做碼表
    就是開始時記下起始時間
    Time_Click時把目前時間減去開始時間
    就可以了

    謙卑學習,持之以恆,才能不斷的Level Up http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 maxcha 2009年9月24日 上午 05:09
    2009年9月22日 上午 09:49
  • 十個最好不要用Backgroundworker (因為它本身就比較粗壯一點)
    用Thread 或 ThreadPool 之類的來做會好一點.
    學而不思則罔, 思而不學則殆. 寫程式無他, 唯勤而已.
    2009年9月22日 下午 02:23
    版主
  • 請問跨表單的THREAD不能傳遞資料嗎?
    EX:
    FORM2中的THREAD不能使用FORM1.a+=1嗎?或者不能與用FORM1.TEXTBOX.TEXT=NOW嗎?

    2009年9月25日 上午 03:28
  • 跨表單的Thread ? 通常子執行緒本來就不應該直接對UI執行緒的控制項做處理,即使你的Thread的方法是寫在這個Form的程式中, 要用Invoke的方法處理
    有一種方法是你把 Form1.a+=1 寫在Form1 Class中, 但是在Form2中Invoke它.
    你可參考以下幾篇既有討論
    [請教執行緒問題? ]
    [有關Class的問題 ]
    [VB2008 跨執行緒存取控制項的使用 ]

    學而不思則罔, 思而不學則殆. 寫程式無他, 唯勤而已.
    2009年9月25日 上午 03:41
    版主
  • http://social.msdn.microsoft.com/Search/zh-TW/?Refinement=112&query=thread%20%u59d4%u6d3e%20%u63a7%u5236%u9805

    建議你先把線上手冊提供的 MultiThread 跑一遍,3 個按鈕示範 3 種 Thread 的執行方式,每個 Thread 各有自己的進度列:

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年9月25日 上午 03:46
  • 請問跨表單的THREAD不能傳遞資料嗎?
    EX:
    FORM2中的THREAD不能使用FORM1.a+=1嗎?或者不能與用FORM1.TEXTBOX.TEXT=NOW嗎?


    Thread 呼叫時,可以透過 New Object(){引數1, ...} 方式傳資料進去,其他時候都需要透過公用變數交換資料。
    控制項的讀取變更,自 VS2005 強化執行緒安全,變成必須透過委派,前一篇給你的 link 就是既有討論。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年9月25日 上午 03:49
  • 公用變數是指用Public宣告的變數嗎?
    我存取跨表單的變數都用這個宣告
    Imports System.Threading
    Public Class Form1
        Public temp As Long
        Dim t As New Thread(AddressOf f1)
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            t.Start()
            Form2.t.Start()
        End Sub
    
        Private Sub f1()
            For z = 1 To 1000
                TextBox1.Text = z
            Next
        End Sub
    End Class
    Imports System.Threading
    Public Class Form2
        Public t As New Thread(AddressOf f2)
    
        Public Sub f2()
            For z = 1 To 10000
                Form3.temp += 1
            Next
        End Sub
    End Class
    2009年9月25日 上午 04:03
  • 公用變數部分,VBNET 是開個模組,丟到模組去宣告。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年9月25日 上午 04:43
  • 我建立一個模組
    在模組裡用DIM宣告
    在表單上還是顯示未宣告
    在模組裡用Public宣告
    在表單上才可以用

    這樣是否表示跟我在表單上用Public宣告是一樣的
    差別只是跨表單時要加上所宣告表單的名稱

    2009年9月25日 上午 05:14
  • 線上手冊:
    Visual Basic 中的存留期
    ms-help://MS.MSDNQTR.v90.cht/dv_vbalr/html/208106fe-79c9-4eec-93c6-55f08548895f.htm

    Visual Basic 中的存取層級
    ms-help://MS.MSDNQTR.v90.cht/dv_vbalr/html/6e06c1ab-fd78-47f0-83a8-1152780b5e1a.htm

    Visual Basic 中的存留期
    ms-help://MS.MSDNQTR.v90.cht/dv_vbalr/html/bd91e390-690a-469a-9946-8dca70bc14e7.htm

    HOW TO:控制變數的可用性
    ms-help://MS.MSDNQTR.v90.cht/dv_vbalr/html/eaf4f073-7922-43ce-ae1e-90ff376ae947.htm

    在表單和控制項使用多執行緒
    ms-help://MS.MSDNQTR.v90.cht/dv_vbalr/html/8988a4e5-102e-4fa0-abed-3fa0d9f8b542.htm

    多執行緒程序的參數和傳回值
    ms-help://MS.MSDNQTR.v90.cht/dv_vbalr/html/98913466-3d74-4f48-a2c0-f2a2c31a3049.htm


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年9月25日 上午 06:29
  • 無法顯示網頁
    請問是網站壞了嗎?
    還是網址要修改?
    2009年9月25日 上午 06:35
  • 請安裝線上手冊 MSDN for Visual Studio 。

    原版有附,你若是用免費版的,可上微軟下載中心取得後安裝。是中文說明。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年9月25日 上午 08:06
  • 您有安裝VS 2008 MSDN的話,把位址複制過去就可看到了,不然就要看網路版...

    Visual Basic 中的範圍

    Visual Basic 中的存取層級

    Visual Basic 中的存留期

    HOW TO:控制變數的可用性

    在表單和控制項使用多執行緒

    多執行緒程序的參數和傳回值

    2009年9月25日 上午 08:06
  • 參考一下MSDN文件庫
    [Control.Invoke 方法 ]
    這個畫面有兩個多載, 點進去看兩個多載都有範例
    學而不思則罔, 思而不學則殆. 寫程式無他, 唯勤而已.
    2009年9月25日 上午 09:12
    版主
  • 請問多執行緒只可以執行一次嗎?
    我在TIMER_TICK裡呼叫多執行緒
    當執行第二次時就不能在執行多執行緒了
    請問這是VB裡的規則
    還是我自己有寫錯什麼
    2009年9月28日 上午 12:54
  • 你看到上面微軟範例那張圖,可以數得到的多執行緒子視窗就七個,你覺得多執行緒只能執行一次嗎?

    把錯誤訊息、行號貼出來,有助於大家的判斷。

    如果多到逼近 32767, 65536 ,可能就要查規格知道上限在哪,至少幾千個執行緒沒問題,只要記憶體夠就行。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年9月28日 上午 05:14
  • 請問多執行緒只可以執行一次嗎?
    我在TIMER_TICK裡呼叫多執行緒
    當執行第二次時就不能在執行多執行緒了
    請問這是VB裡的規則
    還是我自己有寫錯什麼
    多執行緒並沒有規定只能執行一次
    問題可能出在你Timer_Tick的呼叫吧
    應該有需要看一下你的Timer_Tick的程式碼

    學而不思則罔, 思而不學則殆. 寫程式無他, 唯勤而已.
    2009年9月28日 上午 08:49
    版主
  • 我Timer_Tick裡面只有放兩個多執行緒的名稱
    2009年9月29日 上午 12:35
  • 把程式貼出來吧,也不曉得您是怎麼呼叫的?或者重複呼叫相同名稱的執行緒...
    2009年9月29日 上午 12:44
  • 我Timer_Tick裡面只有放兩個多執行緒的名稱

    你這樣回我們恐怕又要瞎猜了.
    可能需要幾個具體資訊:
    1. Timer_Tick的程序內容
    2. Timer 的 Interval Time
    3. 兩個執行緒的程序內容.
    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    2009年9月29日 上午 03:50
    版主
  • Imports System.Threading
    Public Class Form1
        Delegate Sub SetTextCallback(ByVal temp As String)
        Dim t As New Thread(AddressOf f1)
        Dim t1 As New Thread(AddressOf f2)
        Dim temp, temp1 As Long
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Timer1.Interval = 1
            Timer1.Enabled = True
        End Sub
    
        Private Sub f1()
            temp += 1
            If Me.TextBox1.InvokeRequired Then
                Dim d As New SetTextCallback(AddressOf text1)
                Me.Invoke(d, New Object() {temp.ToString})
            Else
                text1()
            End If
        End Sub
    
        Private Sub f2()
            temp1 += 1
            If Me.TextBox2.InvokeRequired Then
                Dim d As New SetTextCallback(AddressOf text2)
                Me.Invoke(d, New Object() {temp1.ToString})
            Else
                text2()
            End If
        End Sub
    
        Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            t.Start()
            t1.Start()
        End Sub
    
        Private Sub text1()
            TextBox1.Text = temp
        End Sub
    
        Private Sub text2()
            TextBox2.Text = temp1
        End Sub
    End Class
    [img]http://www.merrypic.com/download.php?file=l7wnpwuidff7chsdhcq3.jpg[/img]
    2009年9月30日 上午 12:45
  •     Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            't.Start()
            't1.Start()
            f1()
            f2()
    
        End Sub

    因為相同執行緒已經Start,除非已停止,否則不能第二次Start,您可以參考以上直接呼叫f1,f2函數;或者把開始執行緒放在Button Click事件裡,f1,f2函數裡用While迴圈包著...
    2009年9月30日 上午 01:35
  • 一個執行緒只能跑一個工作,你只宣告兩個執行緒,當然只能最多跑兩個了...

    一般都是用清單或陣列來管理自訂執行緒,例如:
    Public MyThreads As New List(Of Thread)
    ...
    Sub NewTask()
       Dim t As New Thread(AddressOf f1)
       t.Start
       MyThreads.Add(t)
    End Sub

    Sub RemoveAboutThreads
       For Each t In MyThreads
          Select Case t.ThreadState
             Case Threading.ThreadState.Stopped
                MyThreads.Remove(t)
          End Select
       Next
    End Sub

    Sub Timer1_Tick
       NewTask()
       RemoveAboutThreads
    End Sub
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年9月30日 上午 03:05
  • 這有一個很大的問題,你的Timer的Interval =1 ,  也就是每 1/1000秒會Tick一次 (事實上在我的電腦上, 最快能完成的要 大約 35/1000秒一個Tick)
    當你的f1()和f2()恐怕還沒做到啥就又要進入tick的程序
    你應該先把Interval放長一點, 建議放到100以上試試看
    關於Windows.Forms.Timer可以參考點部落
    [三種時間人《.NET中的Timer(1)》 ]

    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    2009年9月30日 上午 03:33
    版主
  • 要開啟執行緒
    不是一定要用Start??
    直接呼叫的話
    就不算是同步執行了不是嗎?
    2009年9月30日 上午 04:39
  • 綜合一下大家的意見
    1. 一個System.Threadig.Thread類別的執行個體在呼叫start方法後, 如果沒有完成工作, 是不能再 呼叫Start方法的 (Joe的內容)
    2. 因為上述的原因, 如果你要讓執行緒不斷地產生, 則必須重新產生該Stsrem.Threading.Thread類別的執行個體 .再呼叫執行個體本身的Start(), 也就是要New . (心冷大的內容)

    寫多執行緒程式必須要對基本觀念有所瞭解,建議你看一下 MSDN文件庫
    [.NET Framework 開發人員手冊 執行緒和執行緒處理 ]
    [.NET Framework 開發人員手冊 使用執行緒和執行緒處理 ]
    學而不思則罔, 思而不學則殆.
    如果你一直都看不懂、不想學習看懂、抗拒看懂MSDN Library的話,那你最好放棄想要寫好程式這件事
    • 已編輯 bauannModerator 2009年9月30日 上午 04:59 修改部分文字
    2009年9月30日 上午 04:56
    版主
  •     Dim blnDo As Boolean = True

        Private Sub f1()

            Do
                System.Threading.Thread.Sleep(1)
                temp += 1
                If Me.TextBox1.InvokeRequired Then
                    Dim d As New SetTextCallback(AddressOf text1)
                    Me.Invoke(d, New Object() {temp.ToString})
                Else
                    text1()
                End If
            Loop While blnDo

        End Sub

        Private Sub f2()

            Do
                System.Threading.Thread.Sleep(1)
                temp1 += 1
                If Me.TextBox2.InvokeRequired Then
                    Dim d As New SetTextCallback(AddressOf text2)
                    Me.Invoke(d, New Object() {temp1.ToString})
                Else
                    text2()
                End If
            Loop While blnDo

        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            'Timer1.Interval = 1
            'Timer1.Enabled = True
            If t.ThreadState = Threading.ThreadState.Running Then
                Exit Sub

            End If

            t.Start()
            t1.Start()

        End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

            blnDo = False

        End Sub

    您這個範例,應該是只要看數字在跑吧,參考以上,不需要使用Timer...
    2009年9月30日 上午 05:14
  • 我主要是想做碼表的功能
    想顯示豪秒的部分
    2009年9月30日 上午 06:31
  • Win9x 時間解析度為 54 ms
    WinNT 時間解析度為 10 ms (大部分的華碩主機板可以跑到 1ms ,其他主機板要配合QueryPerformanceFrequency API)
    http://tlcheng.spaces.live.com/blog/cns!145419920BFD55A7!1640.entry
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年9月30日 上午 06:45
  • 另外,GPU 是效能瓶頸所在,大量的畫面更新動作,將導致執行速度變慢,造成 CPU 再等 GPU 回傳資料的狀態。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年9月30日 上午 06:46
  • 心冷大 您上面說的瓶頸  應該不太會存在喔
    跑3DMARK那些會比較看的出來
    我喵一下原始發文者的代碼而已
    也沒調用到DirectX吧
    (雖然DX到頭來也是利用用內核函數 可是過程為了效率而已 它大多是直接對談的 所以速度會比較快)
    且這些都可以設定的 且應該還沒恐怖到整個畫面負擔不了
    所以應該不會有這種問題才對 ...以上個人想法
    2009年9月30日 上午 07:15
  • Imports System.Threading
    Public Class Form1
        Delegate Sub SetTextCallback(ByVal temp As String)
        Dim t, t1
        Dim temp, temp1, a As Long
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Timer1.Interval = 1000
            Timer1.Enabled = True
        End Sub
    
        Private Sub f1()
            temp += 1
            If Me.TextBox1.InvokeRequired Then
                Dim d As New SetTextCallback(AddressOf text1)
                Me.Invoke(d, New Object() {temp.ToString})
            Else
                text1()
            End If
        End Sub
    
        Private Sub f2()
            temp1 += 1
            If Me.TextBox2.InvokeRequired Then
                Dim d As New SetTextCallback(AddressOf text2)
                Me.Invoke(d, New Object() {temp1.ToString})
            Else
                text2()
            End If
        End Sub
    
        Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            t = New Thread(AddressOf f1)
            t1 = New Thread(AddressOf f2)
            t.Start()
            t1.Start()
        End Sub
    
        Private Sub text1()
            TextBox1.Text = temp
        End Sub
    
        Private Sub text2()
            TextBox2.Text = temp1
        End Sub
    End Class
    按照B大說的在Timer1_Tick裡面指定就可以了
    2009年10月2日 上午 12:25