2009-04-30 18 views
5

मैं यूएसबी पर एक उपकरण शुरू करने के लिए पृष्ठभूमि धागे का उपयोग कर रहा हूँ। जब मैं डिवाइस खोलने का प्रयास करता हूं तो UI लटकता है। मैं डिवाइस पर ओपन कॉल करते समय पृष्ठभूमि थ्रेड को रोकने की अपेक्षा करता हूं, लेकिन UI थ्रेड नहीं। मैं बैकग्राउंड थ्रेड से यूआई इंटरैक्शन के बिना इसका परीक्षण कर रहा हूं। मुझे नहीं पता कि समस्या को कैसे डिबग करना है, और यह एक सवाल बहुत व्यापक है, लेकिन शायद किसी ने पहले ऐसा कुछ देखा है। जहां तक ​​मुझे पता है ActiveX इंटरऑप के साथ कुछ भी गलत नहीं है, डिवाइस सही तरीके से काम करता है। यह सामान्य दृष्टिकोण है:पृष्ठभूमि थ्रेड यूआई थ्रेड को कैसे लटका सकता है?

using System; 
using FancyVoltmeterLibrary; 

namespace SOQuestion 
{ 
    public class MeterClass 
    { 
     private FancyVoltmeter meter; 
     private Thread meterThread; 

     public MeterClass() 
     { 
      // Create instance of ActiveX/COM object. 
      meter = new FancyVoltmeter(); 

      meterThread = new Thread(UpdateMeter); 
      meterThread.Name = "Meter Thread"; 
      meterThread.Priority = ThreadPriority.Normal; 
      meterThread.IsBackground = true; 
      meterThread.Start(); 
     } 

     private void UpdateMeter() 
     { 
      while(true) 
      { 
       Thread.Sleep(1000); 
       if(!meter.IsOpen()) 
       { 
        // Meter may be powered off here. 
        // The call to Open takes about 1 second. 
        // UI hangs during the call??? 
        meter.Open(); 
       } 
       // code to read meter goes here. 
      } 
     } 
    } 
} 

संपादित करें: शायद अस्पष्ट मेरा मतलब क्या है। 'लटका' से मुझे कहना चाहिए कि 'क्षणिक रूप से जम जाता है'।

उत्तर

3

क्या मीटर को एसटीए में चलने की आवश्यकता है? क्या इस कारण से ओपन() वास्तव में यूआई थ्रेड पर कॉल किया जा रहा है?

आप यह सत्यापित कर सकते हैं कि डीबगर में लटका यूआई थ्रेड के कॉलस्टैक को देखकर यह सच है।

+0

यूआई एक पल के लिए ही जमा और मैं कैसे इस मामले में डीबगर में तोड़ने के लिए पता नहीं है में बाहर इस में पाया गया कि। लेकिन आपने मुझे थ्रेड हैंडलर 'अपडेटमीटर' में 'नई फैंसी वोल्ल्टमीटर()' रेखा डालने का विचार दिया। यूआई अब फ्रीज नहीं है, और यह बहुत दिलचस्प है। –

0

मैं सुझाव दूंगा कि आप कॉल को अलग तरीके से मीटर.ऑपेन() पर लपेटें और फॉर्म या अभिभावक नियंत्रण पर Invoke() या BeginInvoke() का उपयोग करके अद्यतन मीटर() विधि के भीतर से उस विधि को कॉल करें। ऐसा करने से यूआई थ्रेड पर वापस कार्रवाई को मार्शल कर दिया जाएगा और इसे शानदार तरीके से निष्पादित करना चाहिए। आशा है कि ये आपकी मदद करेगा।

+0

मैंने अभी यह कोशिश की है और यह अभी भी ओपन कॉल के दौरान मुख्य विंडो को फ्रीज करता है। मैंने इसके साथ MethodInvoker की कोशिश की: var hwnd = Process.GetCurrentProcess()। MainWindowHandle; mainWnd = Control.FromHandle (hwnd); यदि (mainWnd! = Null) mainWnd.Invoke (विधि); –

+0

क्या उस प्रश्न से बचने की कोशिश कर रहे सटीक व्यवहार की अपेक्षा कम या कम नहीं होगी? यदि ओपन कॉल में कुछ समय लगता है और यूआई थ्रेड पर निष्पादित करने के लिए मजबूर है, तो निश्चित रूप से यूआई उस समय उत्तरदायी रहेगा? –

0

इस कार्य के लिए पृष्ठभूमिवर्कर का उपयोग करने पर विचार करें।

+0

मैंने पहले पृष्ठभूमिवर्कर की कोशिश की और ऐप को तब भी समय-समय पर जम गया जब ओपन को बुलाया गया था। वर्कर थ्रेड के भीतर ActiveX नियंत्रण को इंस्टेंट करना एकमात्र चीज है जो काम करता है, अब तक। –

2

फैंसीवोल्टमीटर का तात्कालिकता कितना समय लगता है? क्या यह हो सकता है कि यह ओपन विधि नहीं है जो यूआई फ्रीज का कारण बनती है, लेकिन COM ऑब्जेक्ट (जो यूआई थ्रेड पर किया जाता है) बनाते हैं?

यदि यह मामला सामने आता है, तो इस वस्तु के निर्माण को नए, अलग कार्यकर्ता थ्रेड पर होने के कारण समस्या का ख्याल रखना चाहिए।

संपादित करें: मैं अब देखा आप पहले से ही माइकल को अपनी टिप्पणी ...

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