Salve ragazzi, ho creato una classe con le directshow.net e ho un problema... praticamente la classe si occupa di prendere il video dalla webcam. In poche parole una volta istanziato l'oggetto, dichiaro handle e l'indice del device che deve usare e mi mostra il video.
Il problema è questo: Il video rimane giustamente aperto finché non lo chiudo con un commando (che è presente anche nel distruttore della classe).
Se premo un bottone che scatena "Application.Exit()" (ovvero chiude tutti i form ed esce dal loop costringendo Application.Run() a tornare). L'oggetto della webcam non viene distrutto causando errore.
Se avvio il commando di chiusura tramite altro bottone, posso chiudere e tutto va bene, ma se la webcam è ancora aperta, non fa in tempo a chiamare il distruttore dell'oggetto e fa errore!
Infatti ho dovuto fare un "walkaround":
Nel form dove richiamo la classe ho dovuto mettere un evento "onClosing" in modo che forzo il form in chiusura (quando viene premuto Application.Exit) a richiamare la funzione che dovrebbe in teoria richiamare il distruttore..
in poche parole:
Se non utilizzo manualmente il distruttore, questo non viene richiamato.
Il distruttore è dichiaro in modo semplice:
L'unico modo per costringerlo ad eseguire this.CloseInterfaces() è richiamare dal form un evento OnClosing e forzarlo da lì. Qualche suggerimento?codice:~webcam() { this.CloseInterfaces(); }
codice:namespace Jarvis { class webcam { public string DeviceName, DevicePath; ~webcam() { this.CloseInterfaces(); } ................... public void CloseInterfaces() { // Stop previewing data if (this.mediaControl != null) this.mediaControl.StopWhenReady(); // Stop receiving events if (this.mediaEventEx != null) this.mediaEventEx.SetNotifyWindow(IntPtr.Zero, WM_GRAPHNOTIFY, IntPtr.Zero); // Relinquish ownership (IMPORTANT!) of the video window. // Failing to call put_Owner can lead to assert failures within // the video renderer, as it still assumes that it has a valid // parent window. if (this.videoWindow != null) { this.videoWindow.put_Visible(OABool.False); this.videoWindow.put_Owner(IntPtr.Zero); } // Remove filter graph from the running object table if (rot != null) { rot.Dispose(); rot = null; } } } }

Rispondi quotando