none
System.ArgumentException: 不可以在不同執行緒上建立控制項的父項。 RRS feed

  • 問題

  • 這是我的一份作業再作一個winsocket的程式
    過程簡述
    當client端A 按一個按鍵即會產生一個新的picturebox
    同時寄出一個訊息由select 去選擇接收, case "24" 接收 給server端,由server端再傳送字串,讓client端B接收後
    讓client端B產生一個picturebox
    case "24"
                Pic_Lion_Enomy(LionIndex_Enomy) = New PictureBox()
                Controls.Add(Pic_Lion_Enomy(LionIndex_Enomy))

    註  Pic_Lion_Enomy()為一個picturebox的陣列
        LionIndex_Enomy int變數=0

    當我這樣寫後 A端的圖案是產生了 但是B端卻出現
    System.ArgumentException: 不可以在不同執行緒上建立控制項的父項。
    不太懂錯誤原因,或著有不同的方法可以達到同樣效果
    2011年12月13日 上午 10:32

解答

  • 給你 sample code, 然後很多解釋在版上都有了, 不要連想都沒想就說 "不知要從何爬起", 你沒用心去爬, 怎會知道自己不瞭解的是在哪 ?

    Public Class Form1
        Dim pictureBoxList As New List(Of PictureBox)
        Dim index As Int32 = 0
     
        ''弄懂這一段====
        Delegate Sub AddPictureBoxInPanel(ByVal pb As PictureBox)
     
        Private Sub AddPictureBoxInkoe(ByVal pb As PictureBox)
            If Me.InvokeRequired = True Then
                Dim addMethod As New AddPictureBoxInPanel(AddressOf AddPictrueBox)
                Me.Invoke(addMethod, New Object() {pb})
            Else
                Me.FlowLayoutPanel1.Controls.Add(pb)
            End If
        End Sub
        ''===到這邊
     
        Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles Button1.Click
            Dim addThread As New Threading.Thread(AddressOf AddPictrueBox)
            addThread.IsBackground = True
            addThread.Start()
        End Sub
     
     
        Private Sub AddPictrueBox()
            Dim picbox As New PictureBox
            picbox.BackColor = Color.Blue
            pictureBoxList.Add(picbox)
            AddPictureBoxInkoe(picbox)
        End Sub
    End Class

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 ChuangMaster 2011年12月14日 下午 06:14
    2011年12月13日 下午 12:28
    版主

所有回覆

  • 跨執行緒UI變更請使用委派

    參考論壇既有相關討論 [跨執行緒委派相關]


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年12月13日 上午 10:55
    版主
  • 謝謝你的回答~"~

    對於VB我還算是初學

    有點不太了解跨執行緒問題...

    不太知道要從何爬起

    2011年12月13日 上午 11:57
  • 給你 sample code, 然後很多解釋在版上都有了, 不要連想都沒想就說 "不知要從何爬起", 你沒用心去爬, 怎會知道自己不瞭解的是在哪 ?

    Public Class Form1
        Dim pictureBoxList As New List(Of PictureBox)
        Dim index As Int32 = 0
     
        ''弄懂這一段====
        Delegate Sub AddPictureBoxInPanel(ByVal pb As PictureBox)
     
        Private Sub AddPictureBoxInkoe(ByVal pb As PictureBox)
            If Me.InvokeRequired = True Then
                Dim addMethod As New AddPictureBoxInPanel(AddressOf AddPictrueBox)
                Me.Invoke(addMethod, New Object() {pb})
            Else
                Me.FlowLayoutPanel1.Controls.Add(pb)
            End If
        End Sub
        ''===到這邊
     
        Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles Button1.Click
            Dim addThread As New Threading.Thread(AddressOf AddPictrueBox)
            addThread.IsBackground = True
            addThread.Start()
        End Sub
     
     
        Private Sub AddPictrueBox()
            Dim picbox As New PictureBox
            picbox.BackColor = Color.Blue
            pictureBoxList.Add(picbox)
            AddPictureBoxInkoe(picbox)
        End Sub
    End Class

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    • 已標示為解答 ChuangMaster 2011年12月14日 下午 06:14
    2011年12月13日 下午 12:28
    版主
  • 因為你在 socket 的事件中處理,那會引發另外一個執行緒來工作。

    相關討論搜尋

    委派 socket

    http://social.msdn.microsoft.com/Search/zh-TW/?Refinement=112&query=%e5%a7%94%e6%b4%be%20socket


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年12月13日 下午 12:56
  • Bill大:
    小弟不才,我爬了文然後
    拿您的東西拼拼湊湊,也不知道跑不跑的了
    如下,還是出了點狀況 
    型別 'System.Windows.Forms.PictureBox[]' 的物件無法轉換成型別 'System.Windows.Forms.PictureBox'
    Public Class Form3
        Dim picturebox(1000) As PictureBox
        Dim index As Integer = 0
        Delegate Sub AddPic(ByVal pc As PictureBox) 
        Private Sub AddPicInvoke(ByVal pb() As PictureBox)
            If Me.InvokeRequired = True Then 
                Dim addMethod As New AddPic(AddressOf AddpictureBox)
                Me.Invoke(addMethod, New Object() {pb})
            Else
                Me.Panel1.Controls.Add(pb(index))
            End If
        End Sub
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim addthread As New Threading.Thread(AddressOf AddpictureBox)
            addthread.Start()
        End Sub
        Sub AddpictureBox()
            picturebox(index) = New PictureBox()
            picturebox(index).Image = New Bitmap(Application.StartupPath & ("\22.jpg"))
            index += 1
            AddPicInvoke(picturebox)
        End Sub
    End Class
    不知道是轉型的問題是出在哪呢?
    2011年12月14日 下午 02:55
  •     Delegate Sub AddPic(ByVal pc As PictureBox) 
        Private Sub AddPicInvoke(ByVal pb() As PictureBox)
       你這兩個的參數型別要相同,

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年12月14日 下午 02:57
    版主
  • Bill大:

    我已經將它變成陣列的引數了,可是執行後按下按鍵沒有反應(圖片沒出現)

    可能原因是出在哪呢?

     Delegate Sub AddPic(ByVal pb() As PictureBox) 

        Private Sub AddPicInvoke(ByVal pb() As PictureBox)
    2011年12月14日 下午 03:19
  •         index += 1
            AddPicInvoke(picturebox)
        不應該事先加1吧 ?
    你應該在 Me.Panel1.Controls.Add(pb(index)) 才將Index+1

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年12月14日 下午 03:26
    版主
  • Bill大:

    謝謝你:) 問題應該已經解決囉!

    額外想要問您,就是msdn library 除了耐心看 有沒有辦法更容易理解? 比方說推薦書之類?

    2011年12月14日 下午 06:16
  • 心冷熱情熄大:

    也謝謝你的回答 讓我知道socket運作會要啟動另外一個執行緒

    2011年12月14日 下午 06:17
  • Bill大:

    謝謝你:) 問題應該已經解決囉!

    額外想要問您,就是msdn library 除了耐心看 有沒有辦法更容易理解? 比方說推薦書之類?

    (1)我想到一件事, 你該不會不知道我第一個回的內容中藍色字個部份是個可以點進去的Hyperlink吧 ?

    (2) 關於讀MSDN文件小朱和我都有寫過幾篇文

    小朱的:

    如何讀 MSDN Library?

    我的

    MSDN文件庫閱讀入門 (1)

    MSDN文件庫閱讀入門 (2)

    MSDN文件庫閱讀入門 (3)

    MSDN文件庫閱讀入門 (4)

    (3) 另外, 小朱的部落格中有許多學習程式的心得, 值得你花時間去讀的,

    如何學習寫程式

    (4) 點部落有很多優秀的朋友寫了許多好文, 是一個可以爬文的好地方


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

    2011年12月15日 上午 04:41
    版主
  • 這篇也可以看看:

    請問要如何攔截所有封包程式


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年12月15日 下午 12:21
  • Bill大:

    我知道,我有進去找資料 :)

    2011年12月15日 下午 02:08
  • 心冷熱情熄:

    謝謝你分享 我會再去看的!

    2011年12月15日 下午 02:09