mirror of
https://github.com/farcasclaudiu/SmartThreadPool.git
synced 2026-06-22 15:01:24 +03:00
Added support for Silverlight and Mono (And more)
Also added: * Join, Choice, and Pipe to SmartThreadPool. * Local performance counters (for Mono, Silverlight, and WindowsCE)
This commit is contained in:
@@ -0,0 +1,209 @@
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user