diff options
| author | jpbruyere <jp.bruyere@hotmail.com> | 2017-02-07 09:30:46 +0100 |
|---|---|---|
| committer | jpbruyere <jp.bruyere@hotmail.com> | 2017-02-07 09:30:46 +0100 |
| commit | f131dc13a350aedbdb3213a32ea7a88e19863497 (patch) | |
| tree | be953027823998ccdae8617e4212617f8965f1e6 /src/Interface.cs | |
| parent | 9a194cad2f20d469698d3e4d0833ae3c28fd4541 (diff) | |
give layout mutex priority to properties update and dont block in update loop
Diffstat (limited to 'src/Interface.cs')
| -rw-r--r-- | src/Interface.cs | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/src/Interface.cs b/src/Interface.cs index 565e6ab4..924f092e 100644 --- a/src/Interface.cs +++ b/src/Interface.cs @@ -438,8 +438,9 @@ namespace Crow #if MEASURE_TIME layoutingMeasure.StartCycle(); #endif - DiscardQueue = new Queue<LayoutingQueueItem> (); - lock (LayoutMutex) { + + if (Monitor.TryEnter (LayoutMutex)) { + DiscardQueue = new Queue<LayoutingQueueItem> (); //Debug.WriteLine ("======= Layouting queue start ======="); LayoutingQueueItem lqi; while (LayoutingQueue.Count > 0) { @@ -451,8 +452,9 @@ namespace Crow lqi.ProcessLayouting (); } LayoutingQueue = DiscardQueue; + Monitor.Exit (LayoutMutex); + DiscardQueue = null; } - DiscardQueue = null; #if MEASURE_TIME layoutingMeasure.StopCycle(); @@ -552,7 +554,8 @@ namespace Crow ptr = 0; } else if (topMost) ptr = 0; - GraphicTree.Insert (ptr, g); + lock (UpdateMutex) + GraphicTree.Insert (ptr, g); g.RegisteredLayoutings = LayoutingType.None; g.RegisterForLayouting (LayoutingType.Sizing | LayoutingType.ArrangeChildren); } @@ -560,7 +563,8 @@ namespace Crow public void DeleteWidget(GraphicObject g) { g.Visible = false;//trick to ensure clip is added to refresh zone - GraphicTree.Remove (g); + lock (UpdateMutex) + GraphicTree.Remove (g); } /// <summary> Put widget on top of other root widgets</summary> public void PutOnTop(GraphicObject g, bool topMost = false) @@ -573,8 +577,10 @@ namespace Crow ptr = 0; if (GraphicTree.IndexOf(g) > ptr) { - GraphicTree.Remove(g); - GraphicTree.Insert(ptr, g); + lock (UpdateMutex) { + GraphicTree.Remove (g); + GraphicTree.Insert (ptr, g); + } EnqueueForRepaint (g); } } @@ -582,13 +588,15 @@ namespace Crow public void ClearInterface() { int i = 0; - while (GraphicTree.Count>0) { - //TODO:parent is not reset to null because object will be added - //to ObjectToRedraw list, and without parent, it fails - GraphicObject g = GraphicTree [i]; - g.DataSource = null; - g.Visible = false; - GraphicTree.RemoveAt (0); + lock (UpdateMutex) { + while (GraphicTree.Count > 0) { + //TODO:parent is not reset to null because object will be added + //to ObjectToRedraw list, and without parent, it fails + GraphicObject g = GraphicTree [i]; + g.DataSource = null; + g.Visible = false; + GraphicTree.RemoveAt (0); + } } #if DEBUG_LAYOUTING LQIsTries = new List<LQIList>(); |