ISampleGrabber से स्ट्रिंग प्राप्त करना और पहले फॉर्म में टेक्स्टबॉक्स अपडेट करना

मैं अपने यूआई को किसी अन्य वर्ग के माध्यम से अपडेट करना चाहता हूं, मैंने फॉर्म 1 ऑब्जेक्ट बनाकर और टेक्स्टबॉक्स को अपडेट करने के लिए एक विधि का उपयोग करके ऐसा करने का प्रयास किया है। इससे एक त्रुटि होती है जो मुझे सूचित करती है कि मेरा डिवाइस ठीक से चल रहा नहीं है।

तो मूल रूप से मैं अपने sample1 पर my samplegrabber.cs क्लास का उपयोग करके टेक्स्टबॉक्स को कैसे अपडेट करूं? इस वर्ग को लगातार कहा जाता है, हालांकि मुझे केवल स्ट्रिंग का उपयोग करने की आवश्यकता है।

ISampleGrabber क्लास SampleCB विधि को कॉल करता है जिसमें निम्न शामिल हैं:

public int SampleCB(double sampletime, IMediaSample sample)
    {
        if (sample == null)
        {
            return -1;
        }
        try
        {
            int length = sample.GetActualDataLength();
            IntPtr buffer;          
            if (sample.GetPointer(out buffer) == 0 && length > 0)
            {
                Bitmap bitmapOfFrame = new Bitmap(width, height, stride, PixelFormat.Format24bppRgb, buffer);
            }                
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
        Marshal.ReleaseComObject(sample);
        return 0;
    }

फॉर्म 1 ऑब्जेक्ट को if स्टेटमेंट के भीतर बनाया गया है, त्रुटि अगर मैं ऑब्जेक्ट बनाता हूं (यहां तक ​​कि f1.updateTextBox (id); ) लाइन के बिना भी।

'UpdateTextBox1' फॉर्म 1 में बनाया गया है:

    public void updateTextBox1(string id)
    {
        textBox1.Text = id;
    }

मुझे प्राप्त त्रुटि निम्नानुसार है:

COMException (0x8007001F) सिस्टम से जुड़ा एक उपकरण नहीं है   ठीक से काम कर रहा है।

0
जोड़ा संपादित
विचारों: 1
प्रासंगिक कोड जोड़ा गया।
जोड़ा लेखक legohead, स्रोत
क्या कोई कोड नमूना है जिसे आप साझा कर सकते हैं जो दिखाता है कि आपने क्या प्रयास किया है? साथ ही, क्या आप सही त्रुटि संदेश पोस्ट कर सकते हैं?
जोड़ा लेखक Krease, स्रोत

1 उत्तर

SampleCB is called on a side thread. You should not do any UI related operations in this callback, instead you might want to store the values in member variables and indicate that you need to continue on the UI thread, e.g. by posting yourself a message and then handling it on the correct thread.

0
जोड़ा
मैंने दिए गए उदाहरणों का उपयोग करने की कोशिश की है हालांकि इसे काम पर नहीं लग रहा है। मेरे SampleCB के भीतर, जहां वर्तमान में एक संदेशबॉक्स दिखाया जा रहा है, मैं कैसे कहूंगा (बेहतर वाक्यांश की कमी के लिए) 'मैं कर रहा हूं, यह स्ट्रिंग है'?
जोड़ा लेखक legohead, स्रोत
'ईवेंट को वापस कॉल करें' का मतलब है क्या आप ISampleGrabber क्लास के भीतर एक नया फ़ंक्शन बनाते हैं और उसे कॉल करते हैं?
जोड़ा लेखक legohead, स्रोत
जो मैं समझ रहा हूं, क्या आपका मतलब है कि मेरे यूआई थ्रेड/फर्स्ट फॉर्म में टाइमर जोड़ें? मैं किस घटना को वापस बुला रहा हूँ? समझने के बारे में खेद है, मैं एक साथ कई धागे का उपयोग करने के लिए बहुत अलग हूं और अलग-अलग डेटा कैसे साझा करते हैं।
जोड़ा लेखक legohead, स्रोत
तो, मेरे यूआई थ्रेड पर मैं एक टाइमर शुरू करूंगा, और एक इवेंट हैंडलर सेट करूंगा जो हर 5 सेकंड में बंद हो जाएगा। फिर मेरे टाइमर इवेंट के भीतर मैं इस बूल की जांच करने के लिए नमूनाग्राबर थ्रेड की जांच कैसे करूं ताकि यह देखने के लिए कि क्या मैं स्ट्रिंग? मैं केवल क्लास ऑब्जेक्ट बनाने और SampleCB को कॉल करने के बारे में सोच सकता हूं, लेकिन क्या इससे कोई त्रुटि नहीं आएगी क्योंकि इसे पहले से ही कहा जा रहा है जहां मैं नमूनाग्रेबर बताता हूं जो कॉलबैक उपयोग करने के लिए है?
जोड़ा लेखक legohead, स्रोत
क्या आप किसी भी कोड उदाहरण के बारे में जानते हैं कि आप क्या सुझाव दे रहे हैं? मुझे लगता है कि अगर मैं इसे क्रिया में देखता हूं तो मैं इसे और अधिक समझ सकता हूं
जोड़ा लेखक legohead, स्रोत
ठीक है, इसलिए मैंने अपना टाइमर सेट अप किया है लेकिन मैं नमूना सीबी से प्रासंगिक जानकारी निकालने के बारे में कैसे जाउंगा।
जोड़ा लेखक legohead, स्रोत
एक टाइमर का उपयोग करने के बजाय यूआई थ्रेड का आह्वान करना संभव है?
जोड़ा लेखक legohead, स्रोत
मैंने टाइमर विधि का उपयोग करने की कोशिश की लेकिन मुझे नहीं पता कि मैं जानकारी को नमूना सीबी </कोड> के रूप में कैसे निकालेगा और इसे फॉर्म 1 f1 = new form1 (); </कोड के बिना फॉर्म 1 पर भेजूंगा > जो मूल त्रुटि पैदा कर रहा था।
जोड़ा लेखक legohead, स्रोत
क्या आप संदेश पोस्टिंग को भी समझा सकते हैं, मैंने नहीं देखा कि आपने मुझे दिए गए दो लिंक का उपयोग कैसे किया? धन्यवाद
जोड़ा लेखक legohead, स्रोत
आपके पास विकल्प हैं कि यह कैसे करें लेकिन - क्योंकि आप एक साधारण चीज़ की तलाश करते हैं - मुझे आपको सबसे अच्छा नहीं माना जाता है लेकिन समझने के लिए सबसे आसान माना जाता है। आपके कॉलबैक में आप स्ट्रिंग को अपने आंतरिक चर में संग्रहीत करते हैं, और आप bool चर को true पर सेट करते हैं। फिर आपकी खिड़की/रूप पर आपके पास एक टाइमर होता है जो नियमित ईवेंट पर अपनी घटना को वापस कॉल करता है, और वहां से जब आप यह true देखते हैं, तो आप संग्रहीत स्ट्रिंग के साथ भी जाना अच्छा होता है।
जोड़ा लेखक Roman R., स्रोत
नहीं, मेरा मतलब है WinForms टाइमर "उचित" UI थ्रेड पर वापस कॉल करने के लिए। इसे एसजी कॉलबैक से पहले से ही पहले से ही सेट किया जाना चाहिए (पहले से ही "गलत" थ्रेड पर चल रहा है)।
जोड़ा लेखक Roman R., स्रोत
टाइमर का <�कोड> टिक ईवेंट UI थ्रेड पर कॉल किया जाता है। यह आपकी रणनीति है: आप एसजी कॉलबैक पर न्यूनतम काम करते हैं (केवल सुरक्षित स्थान पर मूल्यों को संग्रहित करते हैं) और फिर टाइमर की घटना आपको "सही" थ्रेड पर लेने का मौका देती है (यह एक सरलीकृत संस्करण है: एक बार जब आप ठीक हो जाते हैं यह, आपको सिंक्रनाइज़ेशन और उदाहरण के लिए इस डेटा को सुरक्षित करने के तरीके को पढ़ने की आवश्यकता होगी उदाहरण के लिए ReaderWriterLock )।
जोड़ा लेखक Roman R., स्रोत
लक्ष्य साइड थ्रेड कॉलबैक से यूआई ऑब्जेक्ट्स को स्पर्श नहीं करता है। इसे प्राप्त करने के कई तरीके हैं, मैंने टाइमर का सुझाव दिया क्योंकि यह सबसे अच्छा तरीका नहीं है (यह नहीं है) लेकिन क्योंकि यह समझना आसान है। यदि आपको यह पसंद नहीं है, तो आपको कुछ और जानने की आवश्यकता हो सकती है - संदेश पोस्टिंग, सिंक्रनाइज़ेशन ऑब्जेक्ट्स, .NET सिंक हेल्पर्स इत्यादि। यह मूल प्रश्न के दायरे से काफी अधिक है।
जोड़ा लेखक Roman R., स्रोत