2013-02-15 12 views
17

मैं लेबल को अद्यतन करने के लिए किसी अन्य वर्ग में थ्रेड लेखन का उपयोग करता हूं। लेबल विनफॉर्म मुख्य श्रेणी में सामग्री है।किसी अन्य धागे से अद्यतन लेबल

Scanner scanner = new Scanner(ref lblCont); 
scanner.ListaFile = this.listFiles; 
Thread trd = new Thread(new ThreadStart(scanner.automaticScanner)); 
trd.IsBackground = true; 
trd.Start(); 
while (!trd.IsAlive) ; 
trd.Join(); 

आप कैसे देख सकते, मैं द्वितीय श्रेणी के निर्माता में लेबल के संदर्भ गुजरती हैं। द्वितीय श्रेणी (स्कैनर) मैं एक विधि "automaticScanner" कहा जाता है कि इस कोड के साथ लेबल अद्यतन करना चाहिए है में:

public Scanner(ref ToolStripStatusLabel _lblContatore) 
{ 
     lblCounter= _lblContatore; 
} 
Thread threadUpdateCounter = new Thread(new ThreadStart(this.UpdateCounter)); 
threadUpdateCounter.IsBackground = true; 
threadUpdateCounter.Start(); 
while (!threadUpdateCounter .IsAlive) ; 
threadUpdateCounter.Join(); 

private void AggiornaContatore() 
{ 
    this.lblCounter.Text = this.index.ToString();   
} 

मैं लेबल के अद्यतन पर यह त्रुटि प्राप्त है:

क्रॉस-धागा आपरेशन मान्य नहीं: नियंत्रण 'मुख्य' एक धागा धागा यह बनाया गया था के अलावा अन्य

मैं साथ Winform सी # .net 4 का उपयोग पर से पहुँचा।

उत्तर के लिए बहुत बहुत धन्यवाद।

समाचार:

trd.Join(); 

यह पंक्ति मेरे जीयूआई ब्लॉक और करने के लिए सक्षम अद्यतन नहीं किया गया था: समस्या इस लाइन है। धागे के खत्म को नियंत्रित करने और अंत तक लेबल को अद्यतन करने के तरीके हैं? धन्यवाद

+0

लेकिन ... अपनी सही कॉल:

private void AggiornaContatore() { if(this.lblCounter.InvokeRequired) { this.lblCounter.BeginInvoke((MethodInvoker) delegate() {this.lblCounter.Text = this.index.ToString(); ;}); } else { this.lblCounter.Text = this.index.ToString(); ; } } 

सूत्रण के बारे में एक स्पष्ट चित्र प्राप्त करने के लिए इस अध्याय और अधिक इस पुस्तक से के माध्यम से जाने के लिए कृपया? थ्रेड trd = नया थ्रेड (नया थ्रेडस्टार्ट (scanner.scansioneAutomatica)); trd.IsBackground = true; trd.Start(); जबकि (! Trd.IsAlive); trd.Join(); इस मोड में जीयूआई अवरुद्ध है! : एस – Antonio

+0

कक्षा एक्शन कोड के अंदर शामिल करें; और टाइमर में भाग लेने के लिए समारोह निजी शून्य T_Elapsed (ऑब्जेक्ट प्रेषक, सिस्टम.Timers.ElapsedEventArgs ई) { सी ++; // प्रतिनिधि अभिव्यक्ति है "y =() => label1.Text = c.ToString()" लेबल 1। इन्वोक (y =() => लेबल 1।पाठ = सी। टॉस्ट्रिंग()); } –

उत्तर

41

आप यूआई थ्रेड के अलावा किसी अन्य थ्रेड से यूआई अपडेट नहीं कर सकते हैं। यूआई थ्रेड पर थ्रेड अपडेट करने के लिए इसका इस्तेमाल करें। इस मोड में धागा

http://www.albahari.com/threading/part2.aspx#_Rich_Client_Applications

+0

lblCounter में InvokeRequired की परिभाषा नहीं है, शुरुआत Beginvoke – Antonio

+0

के लिए मेरे पास लेबल नहीं है, लेकिन ToolStripStatusLabel – Antonio

+0

आईआईआरसी, InvokeRequired हर नियंत्रण में मौजूद है, लेकिन संरक्षित है, यही कारण है कि आप इसे केवल " आपकी वर्तमान कक्षा "(यानी: फॉर्म, उपयोगकर्ता नियंत्रण) और किसी अन्य वर्ग (यानी लेबल, टेक्स्टबॉक्स) पर पहुंचने का प्रयास करने से – quetzalcoatl

10

अन्य धागे में लेबल पाठ को अद्यतन करने के लिए MethodInvoker का उपयोग करें।

private void AggiornaContatore() 
{ 
    MethodInvoker inv = delegate 
    { 
     this.lblCounter.Text = this.index.ToString(); 
    } 

this.Invoke(inv); 
} 

आप क्योंकि आपके यूआई धागा लेबल कर रहा है त्रुटि मिल रही है, और जब से तुम एक और धागा आप पार धागा अपवाद हो रही है के माध्यम से इसे अद्यतन करने के प्रयास कर रहे हैं कर रहे हैं।

आप यह भी देख सकते हैं: Threading in Windows Forms

+0

मेरी कक्षा इंटरफ़ेस IDISposable नहीं है। इस कारण से। आईएस डिस्प्लेड नहीं मिला .. – Antonio

+0

@ एंटोनियो, चेक को हटाएं और बस इसे सीधे कॉल करें – Habib

+0

विधि में मेरी कक्षा स्कैनर के एग्गीर्नना contatore विधि Invoke नहीं मिला है। – Antonio