none
執行緖問題 RRS feed

  • 問題

  • 正常執行如下 當按下button1時 msgbox 顯示為3

    Public Class Form1

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

        Private Sub test()
            MsgBox(Form2.Label1.Text)
        End Sub

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Form2.Show()
            Form2.Label1.Text = "3"
        End Sub
    End Class

    當改用執行緖執行時 當按下button1時 msgbox 則顯示為label1 如何改才能正常執行呢?

    Public Class Form1

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim myThread As New System.Threading.Thread(AddressOf test)
            myThread.Start()
        End Sub

        Private Sub test()
            MsgBox(Form2.Label1.Text)
        End Sub

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Form2.Show()
            Form2.Label1.Text = "3"
        End Sub
    End Class

    2015年10月25日 下午 01:32

解答

  • 因為後來的 Form2 不是原來的 Form2,

    改變一下習慣, 不要直接用呼叫 Form class name 的方式產生執行個體.

    改用 Dim frm as Form2 = new Form2()


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2015年10月25日 下午 01:40
    版主

所有回覆

  • 因為後來的 Form2 不是原來的 Form2,

    改變一下習慣, 不要直接用呼叫 Form class name 的方式產生執行個體.

    改用 Dim frm as Form2 = new Form2()


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2015年10月25日 下午 01:40
    版主
  • 我不太懂您的意思

    請問有範例嗎

    2015年10月25日 下午 02:16
  • 你先寫以下的程式, 然後多按幾次 Form1 的 Button, 看看會發生甚麼事

    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim t As Thread = New Thread(AddressOf ShowForm2)
            t.Start()
        End Sub
    
    
        Private Sub ShowForm2()
            Form2.ShowDialog()
        End Sub
    End Class


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2015年10月25日 下午 02:35
    版主
  • 所以你的程式碼, 要改成這樣才不會一直搞出新的 Form2 出來
    Public Class Form1
    
        Dim frm As Form2 = New Form2()
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            frm.Show()
            frm.Label1.Text = "3"
        End Sub
    
        Private Sub test()
            MsgBox(frm.Label1.Text)
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim myThread As New System.Threading.Thread(AddressOf test)
            myThread.Start()
        End Sub
    End Class
    


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2015年10月25日 下午 02:38
    版主
  • 大大的意思是新的執行緖 執行時 form2都是新產生的單表 而不是一開始form2表單

    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim t As Thread = New Thread(AddressOf ShowForm2)
            t.Start()
        End Sub
    
    
        Private Sub ShowForm2()
            Form2.ShowDialog()
        End Sub
    End Class

    而下面是宣告 Dim frm As Form2 = New Form2()

    所以就不會一直產生新的form2 而是原本建立的form2?

    Public Class Form1
    
        Dim frm As Form2 = New Form2()
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            frm.Show()
            frm.Label1.Text = "3"
        End Sub
    
        Private Sub test()
            MsgBox(frm.Label1.Text)
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim myThread As New System.Threading.Thread(AddressOf test)
            myThread.Start()
        End Sub
    End Class

    2015年10月25日 下午 03:39
  • 謝謝大大詳細說明

    大概了解了

    2015年10月25日 下午 04:05
  • 大大的意思是新的執行緖 執行時 form2都是新產生的單表 而不是一開始form2表單

    Public Class Form1
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim t As Thread = New Thread(AddressOf ShowForm2)
            t.Start()
        End Sub
    
    
        Private Sub ShowForm2()
            Form2.ShowDialog()
        End Sub
    End Class

    而下面是宣告 Dim frm As Form2 = New Form2()

    所以就不會一直產生新的form2 而是原本建立的form2?

    Public Class Form1
    
        Dim frm As Form2 = New Form2()
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            frm.Show()
            frm.Label1.Text = "3"
        End Sub
    
        Private Sub test()
            MsgBox(frm.Label1.Text)
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim myThread As New System.Threading.Thread(AddressOf test)
            myThread.Start()
        End Sub
    End Class

    是的, Visual Basic 這個相容性的做法真會搞死人

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2015年10月25日 下午 04:34
    版主