2014-07-18 12 views
8

Kullanıcı bir düğmeyi tıkladığında main() 'da başlatılan dağıtıcılarımı durdurmak istiyorum.Dağıtıcıdan nasıl çıkabilirim (durdurabilirim)?

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(); 
    } 

Ben onFrameEventFocusCam durdu iken ben hata mesajı aşağıdaki olsun bu kodu çalıştırdığınızda:

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

Ana iş parçacığı dağıtıcısını durdurursanız, uygulama çalışmayı durduracak ... gerçekten istediğiniz nedir? Tam olarak ne yapmaya çalışıyorsun? –

+0

Ana parçacığı durdurmak istemiyorum. Yapmaya çalıştığım, kameranın canlı bir görüntü göstermesini durdurmaktır. Uygulama hala çalışmalıdır. – Norick

cevap

2

Eğer BeginInvokeDispatcher diyoruz, bu kapatmaya sevk görevlisi neden uyumsuz; Halihazırdaki dağıtım programı çerçevesini kapatmadan önce işlemeye devam etmesi gerekiyor. Ancak, dağıtım programının kapatılması için bir döngü içinde beklediğiniz için, geçerli çerçeve asla tamamlanmaz, bu nedenle dağıtım programı kapatmayı tamamlayamaz. Bunun yerine, dağıtıcı kapatıldığında algılamak için ShutdownFinished olayına abone olabilirsiniz.

onFrameEventFocusCam ile karşılaştığınız hataya gelince, bunun nedeni dağıtıcı kapatılıyor, dolayısıyla Invoke; Belgelerden:

Kapatma işlemi başladıktan sonra, kuyruktaki tüm bekleyen iş öğeleri iptal edilir. Ne yapmaya çalışıyor, ancak ana dağıtıcısı kapatıyorlar emin değilim

çok muhtemelen etkili uygulamayı durduracak olarak yolu, bunu yapmak için değil...

+0

Kodu, kullandığım şekilde değiştirdim: 'Camera.EventFrame - = onFrameEventFocusCam; Dispatcher.InvokeShutdown(); ' Şimdi kapatma işlemi başladı, ancak henüz bitmiyor. Bu iş bitene kadar ShutdownFinished-Event'de beklemem gerekiyor mu? – Norick

+0

@Norick, dağıtıcıyı kapatmayın. İstediğinizi yapmaz, sadece uygulamayı durdurur. Etkinlikten çıkmak, görüntüleri görüntülemeyi durdurmak için yeterli olmalıdır. –

+0

Etkinliğin aboneliğini iptal ettim ancak yine de aynı hata mesajını alıyorum. Ayrıca dağıtıcıyı kapatırsam, uygulama hala çalışıyor ama en azından olay (neredeyse) artık gerçekleşmiyor. Tam olarak neden düzgün çalışmadığını anlamıyorum ... – Norick

0

Ana uygulama dizinizde çalışan stop dağıtıcı yapmak için Dispatcher.Invoke uygulamasına iletilen eylemden dönüşü çağırmalısınız.

+0

Bir örnek verebilir misiniz lütfen? – Norick

2

Orijinal niyetinizin ne olduğu açık değil.

Bu kod, (neredeyse) sonsuza kadar askıda kalmalıdır çünkü uygulama çıkana kadar HasShutdownStarted doğru olmaz.

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

Bu kod, UI iş parçacığı üzerindeki temsilci yürütme zamanlamayı zamanlar. Mükemmel görünüyor. kulp iki kez serbest bırakılabilir daha NesneSil aslında Dispose kez Sil içinde ve bir kez, kolu serbest bırakır çünkü eğer

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

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

Bu kod olası sorunlu görünüyor. Bu atabilir.

DeleteObject(hBitmap); 
bitmap.Dispose();