none
程式寫法 RRS feed

  • 問題

  • 大大您们好,我想請問一下,我加了一個執行緒在副函式,那我可以利用委派方式去叫用我主表單顯示資訊嗎,因為加的那個執行緒是一直不斷執行,我想要當他改變數值時,告訴主表單該去更新顯示了,我之前的作法是利用時間每秒更新表單的值,想問如果不用timer我這個方法是否合理,謝謝
    2009年4月16日 上午 07:58

解答

  • 小綠兒:
            是的,跨執行緒變更控制項需要以委派的方法進行.這個方法是可行的.
           
    • 已標示為解答 冰糖旋風 2009年4月16日 上午 08:52
    2009年4月16日 上午 08:03
    版主
  • 小綠兒:
        先假設有兩個東西, (a)是你的主畫面程式 Form1 (b)是一個自訂的Class ,假設名為Class1
        然後你在Form1先寫好一個委派,讓其它執行緒可以變更Label1的Text.
        現在你想要在Class1中做一個多執行緒的Method.
        然後在Form1建立一個Class1的執行個體CS1,你要讓CS1的執行緒利用Form1的委派來修改label1的Text.
        如果是這樣,你可能要把Form1的參照位址傳給(byRef) CS1執行個體才會動作

          
    • 已標示為解答 冰糖旋風 2009年4月16日 上午 08:52
    2009年4月16日 上午 08:46
    版主
  • 也許妳該看一下這篇
    感覺妳物件參考的概念有點不足
    新New出的物件
    跟本來的物件是不同的記憶體


    http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 冰糖旋風 2009年4月16日 上午 09:04
    2009年4月16日 上午 08:55
  • 小綠兒:
        這樣會出現兩個Form1...
        我有一個VB 2005的Code給你參考
      Public Class Form1
        Delegate Sub SetMsg1Callback(ByVal InputString As String)
        Public Sub DisplayMsg1(ByVal strReceive As String)
            If Me.Label1.InvokeRequired Then
                Dim d As New SetMsg1Callback(AddressOf DisplayMsg1)
                Me.Invoke(d, New Object() {strReceive})
            Else
                Me.Label1.Text = strReceive
            End If
        End Sub
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim CS As New Class1
            CS.ThreadStart(Me)
        End Sub
     End Class

    Imports System.Threading
    Public Class Class1
        Public Sub ThreadStart(ByRef obj As Object)
            ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf Looping), obj)
        End Sub
        Private Sub Looping(ByVal stateOBJ As Object)
            Dim obj As Form1
            obj = CType(stateOBJ, Form1)
            Dim i As Integer
            While True
                obj.DisplayMsg1(i)
                System.Threading.Thread.Sleep(200)
                i += 1
            End While
        End Sub
    End Class
     
    • 已標示為解答 冰糖旋風 2009年4月16日 上午 09:15
    2009年4月16日 上午 08:58
    版主

所有回覆

  • 用委派跨執行緒去更改表單的值
    是可以做到
    但合不合理要看妳的程式需求
    應該妳最清楚

    http://www.dotblogs.com.tw/larrynung/
    2009年4月16日 上午 08:01
  • 小綠兒:
            是的,跨執行緒變更控制項需要以委派的方法進行.這個方法是可行的.
           
    • 已標示為解答 冰糖旋風 2009年4月16日 上午 08:52
    2009年4月16日 上午 08:03
    版主
  • 大大謝謝您们,在請教一下,因為我之前已經有寫跨執行緒,但是那時是在同一個函式,即表單上所以可以直接呼叫的控制項,雖不同執行緒但都有label屬性,但現在我把兩個執行緒要做的工作,分的很細,請問若是這樣,我是不是要把表單的控制項傳到另一個執行緒(只有用class檔寫)裡,謝謝
    2009年4月16日 上午 08:18
  • 小綠兒:
        先假設有兩個東西, (a)是你的主畫面程式 Form1 (b)是一個自訂的Class ,假設名為Class1
        然後你在Form1先寫好一個委派,讓其它執行緒可以變更Label1的Text.
        現在你想要在Class1中做一個多執行緒的Method.
        然後在Form1建立一個Class1的執行個體CS1,你要讓CS1的執行緒利用Form1的委派來修改label1的Text.
        如果是這樣,你可能要把Form1的參照位址傳給(byRef) CS1執行個體才會動作

          
    • 已標示為解答 冰糖旋風 2009年4月16日 上午 08:52
    2009年4月16日 上午 08:46
    版主
  • 大大您好,那我是不是在class1也要令form1 Myform=new form1();嗎
    2009年4月16日 上午 08:51
  • 也許妳該看一下這篇
    感覺妳物件參考的概念有點不足
    新New出的物件
    跟本來的物件是不同的記憶體


    http://www.dotblogs.com.tw/larrynung/
    • 已標示為解答 冰糖旋風 2009年4月16日 上午 09:04
    2009年4月16日 上午 08:55
  • 小綠兒:
        這樣會出現兩個Form1...
        我有一個VB 2005的Code給你參考
      Public Class Form1
        Delegate Sub SetMsg1Callback(ByVal InputString As String)
        Public Sub DisplayMsg1(ByVal strReceive As String)
            If Me.Label1.InvokeRequired Then
                Dim d As New SetMsg1Callback(AddressOf DisplayMsg1)
                Me.Invoke(d, New Object() {strReceive})
            Else
                Me.Label1.Text = strReceive
            End If
        End Sub
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim CS As New Class1
            CS.ThreadStart(Me)
        End Sub
     End Class

    Imports System.Threading
    Public Class Class1
        Public Sub ThreadStart(ByRef obj As Object)
            ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf Looping), obj)
        End Sub
        Private Sub Looping(ByVal stateOBJ As Object)
            Dim obj As Form1
            obj = CType(stateOBJ, Form1)
            Dim i As Integer
            While True
                obj.DisplayMsg1(i)
                System.Threading.Thread.Sleep(200)
                i += 1
            End While
        End Sub
    End Class
     
    • 已標示為解答 冰糖旋風 2009年4月16日 上午 09:15
    2009年4月16日 上午 08:58
    版主
  • 謝謝大大
    2009年4月16日 上午 09:04