aboutsummaryrefslogtreecommitdiffstatsci
path: root/src/Interface.cs
diff options
context:
space:
mode:
authorjpbruyere <jp.bruyere@hotmail.com>2017-02-07 09:30:46 +0100
committerjpbruyere <jp.bruyere@hotmail.com>2017-02-07 09:30:46 +0100
commitf131dc13a350aedbdb3213a32ea7a88e19863497 (patch)
treebe953027823998ccdae8617e4212617f8965f1e6 /src/Interface.cs
parent9a194cad2f20d469698d3e4d0833ae3c28fd4541 (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.cs36
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>();