public int Row { get; set; } // Assigned row for this counter. May change during operation.
}
+ private readonly object _lock = new object();
private readonly Dictionary<string, ObservedProvider> providers = new Dictionary<string, ObservedProvider>(); // Tracks observed providers and counters.
private const int Indent = 4; // Counter name indent size.
private int maxNameLength = 40; // Allow room for 40 character counter names by default.
private bool paused = false;
private bool initialized = false;
+ private int maxRow = -1;
+
public void Initialize()
{
AssignRowsAndInitializeDisplay();
counter.Row = row++;
}
}
+
+ maxRow = Math.Max(maxRow, row);
}
public void ToggleStatus(bool pauseCmdSet)
public void CounterPayloadReceived(string providerName, ICounterPayload payload, bool pauseCmdSet)
{
- if (!initialized)
+ lock (_lock)
{
- initialized = true;
- AssignRowsAndInitializeDisplay();
- }
+ if (!initialized)
+ {
+ initialized = true;
+ AssignRowsAndInitializeDisplay();
+ }
- if (pauseCmdSet)
- {
- return;
- }
+ if (pauseCmdSet)
+ {
+ return;
+ }
- string name = payload.GetName();
+ string name = payload.GetName();
- bool redraw = false;
- if (!providers.TryGetValue(providerName, out ObservedProvider provider))
- {
- providers[providerName] = provider = new ObservedProvider(providerName);
- redraw = true;
- }
+ bool redraw = false;
+ if (!providers.TryGetValue(providerName, out ObservedProvider provider))
+ {
+ providers[providerName] = provider = new ObservedProvider(providerName);
+ redraw = true;
+ }
- if (!provider.Counters.TryGetValue(name, out ObservedCounter counter))
- {
- string displayName = payload.GetDisplay();
- provider.Counters[name] = counter = new ObservedCounter(displayName);
- maxNameLength = Math.Max(maxNameLength, displayName.Length);
- redraw = true;
- }
+ if (!provider.Counters.TryGetValue(name, out ObservedCounter counter))
+ {
+ string displayName = payload.GetDisplay();
+ provider.Counters[name] = counter = new ObservedCounter(displayName);
+ maxNameLength = Math.Max(maxNameLength, displayName.Length);
+ redraw = true;
+ }
- const string DecimalPlaces = "###";
- string payloadVal = payload.GetValue().ToString("#,0." + DecimalPlaces, CultureInfo.CurrentCulture);
- int decimalIndex = payloadVal.IndexOf(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, StringComparison.CurrentCulture);
- if (decimalIndex == -1)
- {
- decimalIndex = payloadVal.Length;
- }
+ const string DecimalPlaces = "###";
+ string payloadVal = payload.GetValue().ToString("#,0." + DecimalPlaces, CultureInfo.CurrentCulture);
+ int decimalIndex = payloadVal.IndexOf(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, StringComparison.CurrentCulture);
+ if (decimalIndex == -1)
+ {
+ decimalIndex = payloadVal.Length;
+ }
- if (decimalIndex > maxPreDecimalDigits)
- {
- maxPreDecimalDigits = decimalIndex;
- redraw = true;
- }
+ if (decimalIndex > maxPreDecimalDigits)
+ {
+ maxPreDecimalDigits = decimalIndex;
+ redraw = true;
+ }
- if (redraw)
- {
- AssignRowsAndInitializeDisplay();
- }
+ if (redraw)
+ {
+ AssignRowsAndInitializeDisplay();
+ }
- Console.SetCursorPosition(Indent + maxNameLength + 1, counter.Row);
- int prefixSpaces = maxPreDecimalDigits - decimalIndex;
- int postfixSpaces = DecimalPlaces.Length - (payloadVal.Length - decimalIndex - 1);
- Console.Write($"{new string(' ', prefixSpaces)}{payloadVal}{new string(' ', postfixSpaces)}");
+ Console.SetCursorPosition(Indent + maxNameLength + 1, counter.Row);
+ int prefixSpaces = maxPreDecimalDigits - decimalIndex;
+ int postfixSpaces = DecimalPlaces.Length - (payloadVal.Length - decimalIndex - 1);
+ Console.Write($"{new string(' ', prefixSpaces)}{payloadVal}{new string(' ', postfixSpaces)}");
+ }
}
public void Stop()
{
- // Nothing to do here.
+ lock (_lock)
+ {
+ if (initialized)
+ {
+ var row = maxRow;
+
+ if (row > -1)
+ {
+ Console.SetCursorPosition(0, row);
+ Console.WriteLine();
+ }
+ }
+ }
}
}
}