/// <summary> /// Called when the repeated task completes. /// </summary> protected override void OnEnd() { // Prefilter items with negative penalties (ie constantly changing variables) this.Snapshot.SetAllValidBits(false); foreach (SnapshotRegion region in this.Snapshot) { for (IEnumerator <SnapshotElementIterator> enumerator = region.IterateElements(PointerIncrementMode.LabelsOnly); enumerator.MoveNext();) { SnapshotElementIterator element = enumerator.Current; if ((Int16)element.ElementLabel > 0) { element.SetValid(true); } } } this.Snapshot.DiscardInvalidRegions(); SnapshotManager.GetInstance().SaveSnapshot(this.Snapshot); this.CleanUp(); LabelThresholderViewModel.GetInstance().OpenLabelThresholder(); }
public void ApplyThreshold() { lock (this.SnapshotLock) { if (this.Snapshot == null) { return; } } Object lowerValue = this.Histogram.Keys[this.LowerIndex]; Object upperValue = this.Histogram.Keys[this.UpperIndex]; lock (this.SnapshotLock) { if (!this.Inverted) { this.Snapshot.SetAllValidBits(false); foreach (SnapshotRegion region in this.Snapshot) { for (IEnumerator <SnapshotElementIterator> enumerator = region.IterateElements(PointerIncrementMode.LabelsOnly); enumerator.MoveNext();) { SnapshotElementIterator element = enumerator.Current; dynamic label = element.GetElementLabel(); if (label >= lowerValue && label <= upperValue) { element.SetValid(true); } } } } else { this.Snapshot.SetAllValidBits(true); foreach (SnapshotRegion region in this.Snapshot) { for (IEnumerator <SnapshotElementIterator> enumerator = region.IterateElements(PointerIncrementMode.LabelsOnly); enumerator.MoveNext();) { SnapshotElementIterator element = enumerator.Current; dynamic label = element.GetElementLabel(); if (label >= lowerValue && label <= upperValue) { element.SetValid(false); } } } } this.Snapshot.DiscardInvalidRegions(); } SnapshotManager.GetInstance().SaveSnapshot(this.Snapshot); this.UpdateHistogram(forceUpdate: true); }
/// <summary> /// Called when the scan updates. /// </summary> /// <param name="cancellationToken">The cancellation token for handling canceled tasks.</param> protected override void OnUpdate(CancellationToken cancellationToken) { Int32 processedPages = 0; Boolean hasRelativeConstraint = this.ScanConstraintManager.HasRelativeConstraint(); // Determine if we need to increment both current and previous value pointers, or just current value pointers PointerIncrementMode pointerIncrementMode = hasRelativeConstraint ? PointerIncrementMode.ValuesOnly : PointerIncrementMode.CurrentOnly; cancellationToken.ThrowIfCancellationRequested(); // Enforce each value constraint foreach (ScanConstraint scanConstraint in this.ScanConstraintManager) { this.Snapshot.SetAllValidBits(false); Parallel.ForEach( this.Snapshot.Cast <SnapshotRegion>(), SettingsViewModel.GetInstance().ParallelSettingsFullCpu, (region) => { // Check for canceled scan if (cancellationToken.IsCancellationRequested) { return; } // Ignore region if it requires current & previous values, but we cannot find them if (hasRelativeConstraint && !region.CanCompare()) { return; } for (IEnumerator <SnapshotElementIterator> enumerator = region.IterateElements(pointerIncrementMode, scanConstraint.Constraint, scanConstraint.ConstraintValue); enumerator.MoveNext();) { SnapshotElementIterator element = enumerator.Current; // Perform the comparison based on the current scan constraint if (element.Compare()) { element.SetValid(true); } } //// End foreach Element lock (this.ProgressLock) { processedPages++; // Limit how often we update the progress if (processedPages % 10 == 0) { this.UpdateProgress(processedPages / this.ScanConstraintManager.Count(), this.Snapshot.RegionCount, canFinalize: false); } } }); //// End foreach Region // Exit if canceled cancellationToken.ThrowIfCancellationRequested(); } //// End foreach Constraint }