#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) {
lqi.ProcessLayouting ();
}
LayoutingQueue = DiscardQueue;
+ Monitor.Exit (LayoutMutex);
+ DiscardQueue = null;
}
- DiscardQueue = null;
#if MEASURE_TIME
layoutingMeasure.StopCycle();
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);
}
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)
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);
}
}
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>();