using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Windows.Forms; using Amib.Threading; using System.Threading; namespace STPCEDemo { public partial class Form1 : Form { private bool running; private readonly System.Windows.Forms.Timer uiTimer; private SmartThreadPool _stp; private readonly System.Windows.Forms.Timer wiTimer; public Form1() { running = false; InitializeComponent(); uiTimer = new System.Windows.Forms.Timer(); uiTimer.Interval = 1000; uiTimer.Tick += uiTimer_Tick; wiTimer = new System.Windows.Forms.Timer(); wiTimer.Interval = 1000; wiTimer.Tick += wiTimer_Tick; //Debug.WriteLine("Form Thread Priority is " + (int)GetCurrentThreadPriority()); } private void Form1_Load(object sender, EventArgs e) { SetRunningState(false); } void uiTimer_Tick(object sender, EventArgs e) { if (null == _stp) { return; } try { int inUse = (int)_stp.PerformanceCountersReader.InUseThreads; int inPool = (int)_stp.PerformanceCountersReader.ActiveThreads; usageHistoryControl1.AddValues(inUse, inPool); usageControl1.Value1 = inUse; usageControl1.Value2 = inPool; lblThreadsInUse.Text = inUse.ToString(); lblThreadsInPool.Text = inPool.ToString(); } catch(Exception ex) { Debug.WriteLine(ex); return; } } void wiTimer_Tick(object sender, EventArgs e) { int count = Convert.ToInt32(spnWorkItemsPerSecond.Value); int sleepDuration = Convert.ToInt32(spnWorkItemDuration.Value); //Debug.WriteLine(string.Format("{0}: C = {1}, S = {2}", DateTime.Now.ToString("HH:mm:ss"), count, sleepDuration)); for (int i = 0; i < count; i++) { _stp.QueueWorkItem(DoWork, sleepDuration); } } private void DoWork(int sleepDuration) { //Debug.WriteLine("DoWork Thread Priority is " + (int)GetCurrentThreadPriority()); DateTime start = DateTime.Now; //int sleepDuration = Convert.ToInt32(state); Thread.Sleep(sleepDuration); TimeSpan duration = DateTime.Now - start; //Debug.WriteLine(string.Format("{0}: Duration = {1}", DateTime.Now.ToString("HH:mm:ss"), duration.TotalMilliseconds)); //return null; } void btnStartStop_Click(object sender, EventArgs e) { SetRunningState(!running); } private void SetRunningState(bool newRunningState) { btnStartStop.Text = newRunningState ? "Stop" : "Start"; if (newRunningState) { STPStartInfo stpStartInfo = new STPStartInfo() { IdleTimeout = Convert.ToInt32(spnIdleTimeout.Value) * 1000, MaxWorkerThreads = Convert.ToInt32(spnMaxThreads.Value), MinWorkerThreads = Convert.ToInt32(spnMinThreads.Value), EnableLocalPerformanceCounters = true, }; _stp = new SmartThreadPool(stpStartInfo); } else { if (null != _stp) { _stp.Shutdown(); } _stp = null; usageHistoryControl1.Reset(); usageControl1.Value1 = 0; usageControl1.Value2 = 0; } spnIdleTimeout.Enabled = !newRunningState; uiTimer.Enabled = newRunningState; wiTimer.Enabled = newRunningState; running = newRunningState; } private void spnMinThreads_ValueChanged(object sender, EventArgs e) { if (null != _stp) { _stp.MinThreads = Convert.ToInt32(spnMinThreads.Value); } } private void spnMaxThreads_ValueChanged(object sender, EventArgs e) { if (null != _stp) { _stp.MaxThreads = Convert.ToInt32(spnMaxThreads.Value); } } private static int GetCurrentThreadPriority() { IntPtr hThread = GetCurrentThread(); int priority = CeGetThreadPriority(hThread); return priority; } [DllImport("coredll.dll", SetLastError = true)] public static extern int CeGetThreadPriority(IntPtr hThread); [DllImport("coredll.dll")] public static extern IntPtr GetCurrentThread(); } }