mirror of
https://github.com/farcasclaudiu/SmartThreadPool.git
synced 2026-06-22 11:01:28 +03:00
760bc5d1a9
Also added: * Join, Choice, and Pipe to SmartThreadPool. * Local performance counters (for Mono, Silverlight, and WindowsCE)
210 lines
6.3 KiB
C#
210 lines
6.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Net;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Documents;
|
|
using System.Windows.Ink;
|
|
using System.Windows.Input;
|
|
using System.Windows.Media;
|
|
using System.Windows.Media.Animation;
|
|
using System.Windows.Shapes;
|
|
|
|
namespace STPSLDemo
|
|
{
|
|
public partial class UsageHistoryControl : UserControl
|
|
{
|
|
private const int _squareWidth = 12;
|
|
private const int maxLastValuesCount = 2000;
|
|
private const int _shiftStep = 3;
|
|
|
|
private int _shift = 0;
|
|
|
|
private int[] lastValues1 = new int[maxLastValuesCount];
|
|
private int[] lastValues2 = new int[maxLastValuesCount];
|
|
private int nextValueIndex;
|
|
private int lastValuesCount;
|
|
|
|
private int max = 100;
|
|
private int min = 0;
|
|
|
|
public UsageHistoryControl()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
public void Reset()
|
|
{
|
|
lastValues1.Initialize();
|
|
lastValues2.Initialize();
|
|
nextValueIndex = 0;
|
|
lastValuesCount = 0;
|
|
Redraw();
|
|
}
|
|
|
|
private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
|
|
{
|
|
Redraw();
|
|
}
|
|
|
|
private void Redraw()
|
|
{
|
|
_surface.Strokes.Clear();
|
|
|
|
for (int i = 0; i <= Width + _squareWidth; i += _squareWidth)
|
|
{
|
|
int x = i - _shift;
|
|
if (x>= 0 && x < Width)
|
|
{
|
|
DrawLine(Colors.Green, x, 0, x, (int) Height);
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < Height; i += _squareWidth)
|
|
{
|
|
DrawLine(Colors.Green, 0, i, (int)Width, i);
|
|
}
|
|
int startValueIndex = (nextValueIndex - 1 + maxLastValuesCount) % maxLastValuesCount;
|
|
|
|
int prevVal1 = GetRelativeValue(lastValues1[startValueIndex]);
|
|
int prevVal2 = GetRelativeValue(lastValues2[startValueIndex]);
|
|
|
|
for (int i = 1; i < lastValuesCount; ++i)
|
|
{
|
|
int index = nextValueIndex - 1 - i;
|
|
if (index < 0)
|
|
{
|
|
index += maxLastValuesCount;
|
|
}
|
|
|
|
int val1 = GetRelativeValue(lastValues1[index]);
|
|
int val2 = GetRelativeValue(lastValues2[index]);
|
|
|
|
//Brush redBrush =
|
|
// new LinearGradientBrush(
|
|
// new Point(0, -(int)Height / 2),
|
|
// new Point(0, (int)Height),
|
|
// Color.Black,
|
|
// Color.Red);
|
|
|
|
DrawLine(
|
|
Colors.Red,
|
|
(int)Width - (i - 1) * _shiftStep, (int)Height - prevVal2,
|
|
(int)Width - i * _shiftStep, (int)Height - val2);
|
|
|
|
//g.FillPolygon(
|
|
// redBrush,
|
|
// new Point[]
|
|
// {
|
|
// new Point((int)Width-(i-1)*_shiftStep, (int)Height-prevVal2),
|
|
// new Point((int)Width-i*_shiftStep, (int)Height-val2),
|
|
// new Point((int)Width-i*_shiftStep, (int)Height),
|
|
// new Point((int)Width-(i-1)*_shiftStep, (int)Height),
|
|
// });
|
|
|
|
//Brush greenBrush =
|
|
// new LinearGradientBrush(
|
|
// new Point(0, -(int)Height / 2),
|
|
// new Point(0, (int)Height),
|
|
// Color.Black,
|
|
// Color.LawnGreen);
|
|
|
|
DrawLine(
|
|
Color.FromArgb(255, 124, 252, 0), // Colors.LawnGreen
|
|
(int)Width - (i - 1) * _shiftStep, (int)Height - prevVal1,
|
|
(int)Width - i * _shiftStep, (int)Height - val1);
|
|
|
|
//g.FillPolygon(
|
|
// greenBrush,
|
|
// new Point[]
|
|
// {
|
|
// new Point((int)Width-(i-1)*_shiftStep, (int)Height-prevVal1),
|
|
// new Point((int)Width-i*_shiftStep, (int)Height-val1),
|
|
// new Point((int)Width-i*_shiftStep, (int)Height),
|
|
// new Point((int)Width-(i-1)*_shiftStep, (int)Height),
|
|
// });
|
|
|
|
prevVal1 = val1;
|
|
prevVal2 = val2;
|
|
}
|
|
|
|
}
|
|
|
|
private int GetRelativeValue(int val)
|
|
{
|
|
int result = val * ((int)Height - 2) / max + 1;
|
|
return result;
|
|
}
|
|
|
|
public void AddValues(int val1, int val2)
|
|
{
|
|
lastValues1[nextValueIndex] = val1;
|
|
lastValues2[nextValueIndex] = val2;
|
|
|
|
nextValueIndex++;
|
|
nextValueIndex %= maxLastValuesCount;
|
|
lastValuesCount++;
|
|
if (lastValuesCount > maxLastValuesCount)
|
|
{
|
|
lastValuesCount = maxLastValuesCount;
|
|
}
|
|
|
|
_shift += _shiftStep;
|
|
_shift %= _squareWidth;
|
|
Redraw();
|
|
}
|
|
|
|
public int Maximum
|
|
{
|
|
get
|
|
{
|
|
return max;
|
|
}
|
|
|
|
set
|
|
{
|
|
// Make sure that the maximum value is never set lower than the minimum value.
|
|
if (value < min)
|
|
{
|
|
min = value;
|
|
}
|
|
|
|
max = value;
|
|
|
|
// Invalidate the control to get a repaint.
|
|
Redraw();
|
|
}
|
|
}
|
|
|
|
private void DrawLine(Color color, int x1, int y1, int x2, int y2)
|
|
{
|
|
if (x1 < 0 || x2 < 0)
|
|
{
|
|
return;
|
|
}
|
|
DrawPolygon(color, new Point(x1, y1), new Point(x2, y2));
|
|
}
|
|
|
|
private void DrawPolygon(
|
|
Color color,
|
|
params Point[] points)
|
|
{
|
|
StylusPointCollection stylusPointCollection = new StylusPointCollection();
|
|
foreach (Point point in points)
|
|
{
|
|
stylusPointCollection.Add(new StylusPoint(point.X, point.Y));
|
|
}
|
|
|
|
Stroke stroke = new Stroke(stylusPointCollection);
|
|
|
|
stroke.DrawingAttributes.Color = color;
|
|
stroke.DrawingAttributes.Width = 1;
|
|
stroke.DrawingAttributes.Height = 1;
|
|
|
|
_surface.Strokes.Add(stroke);
|
|
}
|
|
|
|
}
|
|
}
|