Show
Ignore:
Timestamp:
04/03/09 14:24:41 (6 years ago)
Author:
schima
Message:

measures of GC

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/cpluspluscli/OpenCvSharp2/trunk/OpenCvSharp/HighGUI/CvWindow.cs

    r31346 r31851  
    1919                private CvMouseCallbackHandler mouseCallback; 
    2020                private Dictionary<string, CvTrackbar> trackbars; 
     21        private ScopedGCHandle callbackHandle; 
    2122 
    2223        #region 初期化と解放 
     
    9697                Windows.Add(name, this); 
    9798            } 
     99            this.callbackHandle = null; 
    98100        } 
    99101        /// <summary> 
     
    132134                    Windows.Remove(name); 
    133135                } 
    134                 catch (Exception) { }                 
     136                catch (Exception) { } 
     137                if (callbackHandle != null && callbackHandle.IsAllocated) 
     138                { 
     139                    callbackHandle.Dispose(); 
     140                } 
    135141            } 
    136142            base.Dispose(); 
     
    184190            get { return CvDll.cvGetWindowHandle(name); } 
    185191        } 
     192        /// <summary> 
     193                /// マウスイベントが発生したときのイベントハンドラ 
     194                /// </summary> 
     195        internal CvMouseCallbackHandler MouseCallback 
     196        { 
     197            get { return mouseCallback; } 
     198            set 
     199            { 
     200                if (callbackHandle != null && callbackHandle.IsAllocated) 
     201                { 
     202                    callbackHandle.Dispose(); 
     203                } 
     204                mouseCallback = value; 
     205                callbackHandle = new ScopedGCHandle(mouseCallback, GCHandleType.Normal); 
     206            } 
     207        } 
    186208        /// <summary> 
    187209                /// マウスイベントが発生したときのイベントハンドラ 
     
    189211                public event CvMouseCallbackHandler OnMouseCallback{ 
    190212                        add{ 
     213                if (callbackHandle != null && callbackHandle.IsAllocated) 
     214                { 
     215                    callbackHandle.Dispose(); 
     216                } 
    191217                                mouseCallback += value; 
     218                callbackHandle = new ScopedGCHandle(mouseCallback, GCHandleType.Normal); 
    192219                CvDll.cvSetMouseCallback(name, mouseCallback); 
    193220                        } 
    194221                        remove{ 
    195                                 mouseCallback -= value; 
     222                if (callbackHandle != null && callbackHandle.IsAllocated) 
     223                { 
     224                    callbackHandle.Dispose(); 
     225                } 
     226                mouseCallback -= value; 
     227                callbackHandle = new ScopedGCHandle(mouseCallback, GCHandleType.Normal); 
    196228                                CvDll.cvSetMouseCallback(name, mouseCallback); 
    197229                        } 
     
    317349                    } 
    318350            } 
     351 
     352        /// <summary> 
     353        /// 指定した名前に対応するウィンドウを得る 
     354        /// </summary> 
     355        /// <param name="name"></param> 
     356        static public CvWindow GetWindowByName(string name) 
     357        { 
     358            if (string.IsNullOrEmpty(name)) 
     359            { 
     360                throw new ArgumentNullException("name"); 
     361            } 
     362            if (Windows.ContainsKey(name)) 
     363            { 
     364                return Windows[name]; 
     365            } 
     366            else 
     367            { 
     368                return null; 
     369            } 
     370        } 
    319371        #endregion 
    320372    }