2010-02-12 20 views
6

से किसी फ़ॉर्म पर नियंत्रण जोड़ें, यह इस साइट पर मेरी पहली पोस्ट है, जो मुझे कहना चाहिए, बढ़िया है!किसी अन्य थ्रेड

वैसे मेरी समस्या है, और मुझे उम्मीद है कि कोई मेरी मदद करने में सक्षम होगा।

मैं अपने प्रारंभिक समय को गति देने के लक्ष्य के साथ अपने मुख्य रूप में नियंत्रण जोड़ने को स्थगित करने का प्रयास कर रहा था। खैर मैं निम्न अपवाद में चलाएँ: वैध

पार धागा आपरेशन नहीं: नियंत्रण 'Form1' एक धागा धागा उस पर बनाया गया था के अलावा अन्य से पहुँचा।

मैंने बस एक छोटे से उदाहरण पर समस्या को हल करने की कोशिश की लेकिन समस्या बनी रहती है।

using System; 
using System.Drawing; 
using System.Threading; 
using System.Windows.Forms; 

namespace AddConrolFromAnotherThread { 
    public partial class Form1 : Form { 

     public Form1() { 
      InitializeComponent(); 
     } 


     private void AddButton() { 
      if(this.InvokeRequired){ 
       this.Invoke(new MethodInvoker(this.AddButton)); 
      } 
      Random random = new Random(2); 
      Thread.Sleep(20); 
      Button button = new Button(); 
      button.Size = new Size(50,50); 
      button.Location = 
       new Point(random.Next(this.Width),random.Next(this.Height)); 
       this.Controls.Add(button); 
     } 

     private void buttonStart_Click(object sender, EventArgs e) { 
      Thread addControlThread = 
       new Thread(new ThreadStart(this.AddButton)); 
      addControlThread.Start(); 
     } 
    } 
} 

मैं आह्वान विधि का उपयोग किया था और जांच की थी, तो InvokeRequiered सही है, लेकिन रह "सही" रखने InvokeRequiered: यहाँ मेरी कोड है। मैं वास्तव में इसे समझ में नहीं आता। कम से कम मैं StackOverflow अपवाद की अपेक्षा करता हूं, क्योंकि यह एक रिकर्सन कॉल है।

तो, अगर कोई भी इसी तरह की समस्या से मिलता है, तो कृपया आप मुझे बता सकते हैं कि मैंने क्या गलत किया?

थानक्स, इगोर!

उत्तर

4

समस्या अपने कोड में है कि अपने कर रहे हैं दो बटन जोड़ने है।

किसी अन्य ब्लॉक में ब्लॉक के बाद कोड को रखें।

private void AddButton() { 
     if(this.InvokeRequired){ 
      this.Invoke(new MethodInvoker(this.AddButton)); 
     } 
     else { 
      Random random = new Random(2); 
      Thread.Sleep(20); 
      Button button = new Button(); 
      button.Size = new Size(50,50); 
      button.Location = new Point(random.Next(this.Width),random.Next(this.Height)); 
      this.Controls.Add(button); 
     } 
    } 
0

इसके बजाय अज्ञात विधियों का उपयोग करें। स्पष्टीकरण नीचे है।

हम इस तरह स्वरूप में हैं:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     Thread t = new Thread(new ThreadStart(Start)); 
     t.Start(); 
    } 

    private void UpdateText() 
    { 
     button1.Text = "New Text"; 
    } 

    void Start() 
    { 
     UpdateText(); 
    } 
} 

यह एक अपवाद फेंक देते हैं।

UpdateText बदलें:

private delegate void MyDelegate(); 

private void UpdateText() 
{ 
    if (button1.InvokeRequired) 
    { 
     button1.Invoke(new MyDelegate(UpdateText)); 
    } 
    button1.Text = "New Text"; 
} 

या का उपयोग गुमनाम विधि:

void Start() 
{ 
    this.Invoke((MyDelegate)delegate 
    { 
     UpdateText(); 
    }); 
} 

private void UpdateText() 
{ 
    button1.Text = "New Text"; 
} 
+0

हाय, सश। त्वरित उत्तर के लिए धन्यवाद। लेकिन मुझे यकीन नहीं है कि हम एक-दूसरे को समझते हैं। मैंने जांच की कि फॉर्म को इनवॉक कॉल की आवश्यकता है या नहीं। और मेरे मामले में मैं नियंत्रण अद्यतन नहीं करता हूं, मैं बस फॉर्म पर एक नया जोड़ने की कोशिश कर रहा हूं। – Gico

+0

अंतर इतना बड़ा नहीं है - आपको उस नियंत्रण को बनाना है जिसे आप उसी थ्रेड में फॉर्म (उदाहरण के लिए प्रारंभिक कॉम्पोनेंट के बाद) में जोड़ना चाहते हैं और केवल वर्णित दृष्टिकोणों का उपयोग करके इसे अलग थ्रेड से जोड़ना चाहते हैं। – sashaeve

0

बस एक बटन जोड़ने के लिए धागे का उपयोग करना बहुत महंगा है! इसके बजाए थ्रेडपूल का प्रयोग करें।

संबंधित मुद्दे