2014-07-18 6 views
8

मैं अपने प्रेषक को रोकना चाहता हूं जो मुख्य() में शुरू हुआ है, जब उपयोगकर्ता बटन पर क्लिक करता है।मैं अपने प्रेषक से कैसे बाहर निकल सकता हूं?

private void button_start_Click(object sender, RoutedEventArgs e) 
    { 
     ... 
      Camera.EventFrame -= onFrameEventFocusCam; //unsubscribe event 

      while (!Dispatcher.HasShutdownStarted) 
      { 
       // test if Dispatcher started shutdown --> ok, it does but never finishs...! 
      } 
     ... 
    }   


    private void onFrameEventFocusCam(object sender, EventArgs e) 
    { 
     ... 

     Dispatcher.Invoke(new Action(() => 
     { 
      // Convert bitmap to WPF-Image 
      var bmp = new Bitmap(bitmap); 
      var hBitmap = bmp.GetHbitmap(); 

      System.Windows.Media.ImageSource wpfBitmap = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
      hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); 

      image_fokus.Source = wpfBitmap; 
      image_fokus.Stretch = System.Windows.Media.Stretch.UniformToFill; 


      DeleteObject(hBitmap); 
      bitmap.Dispose(); 

     })); 
     GC.Collect(); 
    } 

मुझे इस कोड मैं त्रुटि संदेश निम्न हो, जबकि यह onFrameEventFocusCam में बंद कर दिया गया है चलाएँ:

Error-Message: Thread was interrupted from a waiting state. 
+0

यदि आप मुख्य थ्रेड प्रेषक को रोकते हैं, तो ऐप काम करना बंद कर देगा ... क्या वाकई आप क्या चाहते हैं? आप वास्तव में क्या करने की कोशिश कर रहे हैं? –

+0

मैं मुख्य धागे को रोकना पसंद नहीं करता हूं। मैं एक लाइव छवि दिखाने के लिए कैमरे को रोकने के लिए क्या कर रहा हूं। आवेदन अभी भी चलाना चाहिए। – Norick

उत्तर

2

जब आप BeginInvokeDispatcher कहते हैं, इसे बंद करने के लिए डिस्पैचर का कारण बनता है एसिंक्रोनस रूप; इसे अभी भी बंद करने से पहले वर्तमान प्रेषक फ्रेम को संसाधित करने की आवश्यकता है। लेकिन चूंकि आप प्रेषक को बंद करने के लिए एक लूप में प्रतीक्षा कर रहे हैं, इसलिए वर्तमान फ्रेम कभी पूरा नहीं होता है, इसलिए प्रेषक शटडाउन को पूरा नहीं कर सकता है। इसके बजाय, प्रेषक को बंद होने पर पता लगाने के लिए आप ShutdownFinished ईवेंट की सदस्यता ले सकते हैं।

त्रुटि के लिए आपको onFrameEventFocusCam में त्रुटि हो रही है, मुझे लगता है कि ऐसा इसलिए है क्योंकि प्रेषक बंद हो रहा है, इसलिए यह Invoke को संसाधित नहीं कर सकता है; प्रलेखन से:

शटडाउन प्रक्रिया शुरू होने के बाद, कतार में सभी लंबित कार्य आइटम निरस्त हो जाते हैं।

मुझे यकीन है कि आप क्या करने की कोशिश कर रहे हैं क्या, लेकिन मुख्य डिस्पैचर को बंद नहीं कर रहा हूँ बहुत शायद है यह नहीं करने के लिए जिस तरह से, के रूप में यह प्रभावी रूप से अनुप्रयोग बंद हो जाएगा ...

+0

मैंने कोड का उपयोग इस तरीके से बदल दिया है कि मैं इसका उपयोग कर रहा हूं: 'Camera.EventFrame - = onFrameEventFocusCam; डिस्पैचर.इनवोकशूटडाउन(); ' अब शट डाउन प्रक्रिया शुरू हुई लेकिन अभी तक खत्म नहीं हुई है। तो क्या मुझे एक शट डाउनफिशिश-इवेंट में इंतजार करने की ज़रूरत है जब तक यह नहीं किया जाता? – Norick

+0

@Norick, प्रेषक को बंद न करें। यह वही नहीं करता जो आप चाहते हैं, यह सिर्फ ऐप को रोक देता है। घटना से सदस्यता छोड़ना छवियों को प्रदर्शित करना बंद करने के लिए पर्याप्त होना चाहिए। –

+0

मैंने ईवेंट से सदस्यता रद्द की लेकिन मुझे अभी भी एक ही त्रुटि संदेश मिलता है। अगर मैं प्रेषक को भी बंद कर देता हूं तो ऐप अभी भी चल रहा है लेकिन कम से कम घटना (लगभग) अब और नहीं होती है। मैं पूरी तरह समझ नहीं पा रहा हूं कि यह सही तरीके से क्यों काम नहीं करता है ... – Norick

0

अपने मुख्य एप्लिकेशन थ्रेड पर स्टॉप डिस्पैचर चलाने के लिए आपको डिस्पैचर को पास की गई कार्रवाई से वापस कॉल करना चाहिए। इन्वोक।

+0

क्या आप कृपया एक उदाहरण दे सकते हैं? – Norick

2

यह स्पष्ट नहीं है कि आप मूल उद्देश्य क्या था।

यह कोड हमेशा के लिए (लगभग) लटका होना चाहिए क्योंकि एप्लिकेशन आउट होने तक हैशशॉटडाउनस्टार्ट सत्य नहीं बनता है।

while (!Dispatcher.HasShutdownStarted) 
      { 
       // test if Dispatcher started shutdown --> ok, it does but never finishs...! 
      } 

यह कोड UI थ्रेड पर प्रतिनिधि के निष्पादन को शेड्यूल करता है। पूरी तरह से ठीक लग रहा है। क्योंकि अगर DeleteObject वास्तव में संभाल,, निपटान में रिलीज हटाएं में एक बार और एक बार से संभाल दो बार जारी किया जा सकता

private void onFrameEventFocusCam(object sender, EventArgs e) 
    { 
     ... 

     Dispatcher.Invoke(new Action(() => 
     { 
     ... 
     } 
    } 

इस कोड को संभावित रूप से समस्या लग रहा है। यह फेंक सकता है।

DeleteObject(hBitmap); 
bitmap.Dispose(); 
संबंधित मुद्दे

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