V | | (auto wire VM using VMLocatot) VM | | (IoC Services) Services | \ (IExecutionCommand) | \ | Network API ( Tibco, 29West, BB, etc.) | / | / (IProdsumer:: Add/Take) Model -----Producer-Consumer BlockingCollection(1) VM will host data and Command properties (2) Actual Processing code will be in Services (3) Services: IExecutionCommand, IUICommand, IConfiguration, ISubscription(topic) (4) Topic=>Model<Topic>=> IObserer<T>.OnNext=>ISubscription<T>
Sunday, August 30, 2015
Prism 5.0 based WPF/MVVM Real-time streaming stack
Saturday, August 29, 2015
Lock Free Volatile Field Updates
void LockfreeUpdate(ref double volatileUpdateTarget, double value) { SpinWait sw = new SpinWait(); while (true) { // after this line, other thread can update the ref double, double comparandAsSnapshot = volatileUpdateTarget; //w/o barrier, before instruction changing volatileUpdateTarget move to after Snapshot=> comparandAsSnapshot stale=>extra spin Thread.MemoryBarrier(); // if preempted=>updateTarget changed != comparand=> no copy, and spin. double? originalRefValueBeforeExchComp = Interlocked.CompareExchange(ref volatileUpdateTarget, value, comparandAsSnapshot); if (originalRefValueBeforeExchComp == comparandAsSnapshot) return; // no preemption sw.SpinOnce(); } } void LockfreeUpdate<T>(ref T volatileUpdateTarget,T value) where T: class { SpinWait sw = new SpinWait(); while (true) { // after this line, other thread can update the ref double, T comparandAsSnapshot = volatileUpdateTarget; // ICE has internal MemoryBarrier so just extra spin here // if preempted=>updateTarget changed != comparand=> no copy, and spin. T originalRefValueBeforeExchComp = Interlocked.CompareExchange(ref volatileUpdateTarget, value, comparandAsSnapshot); if (originalRefValueBeforeExchComp == comparandAsSnapshot) return; // no preemption sw.SpinOnce(); } } void LockfreeUpdate<T>(ref T volatileUpdateTarget,func<T,T> updateFunc) where T: class { SpinWait sw = new SpinWait(); while (true) { // after this line, other thread can update the ref double, T comparandAsSnapshot = volatileUpdateTarget; // if preempted=>updateTarget changed != comparand=> no copy, and spin. T originalRefValueBeforeExchComp = Interlocked.CompareExchange(ref volatileUpdateTarget, updateFunc(comparandAsSnapshot ), comparandAsSnapshot); if (originalRefValueBeforeExchComp == comparandAsSnapshot) return; // no preemption sw.SpinOnce(); } }
Tuesday, August 18, 2015
WPF GridCOntrol Get to Cell content in Master-Detail
var hPanel = VisualTreeHelpers.FindChild<HierarchyPanel>(AssociatedObject); if (hPanel == null) return; var listOfRowAndCell= new List<Tuple<bool,int, List<Tuple<object, string>>>>(); foreach (var hpChild in hPanel.Children) { var row = hpChild as GridRow; if (row == null) continue; var sviPanel = VisualTreeHelpers.FindChild<StackVisibleIndexPanel>(row); if (sviPanel == null) continue; var list= new List<Tuple<object, string>>(); foreach (var child in sviPanel.Children) { var cellContentPresenter = child as GridCellContentPresenter; // now we got to cell level if (cellContentPresenter == null) continue; var cell = cellContentPresenter.Element as DevExpress.Xpf.Grid.CellEditor; if (cell == null) continue; // Store Visible Text Value for later Validation var ev = cell.Edit.EditValue; var fn = cell.Column.FieldName; list.Add(new Tuple<object, string>(ev,fn)); } if (row.RowDataContent == null || row.RowDataContent.DataContext == null || row.RowDataContent.DataContext as RowData==null) continue; int rh = (row.RowDataContent.DataContext as RowData).RowHandle.Value; listOfRowAndCell.Add(new Tuple<bool,int, List<Tuple<object, string>>>(IsMasterRow(row),rh,list)); }
Subscribe to:
Posts (Atom)