Mega Code Archive

 
Categories / C# / GUI Windows Form
 

Thread and UI Demo

using System; using System.Threading; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; public struct MyData {     public double pi;     public int iters; } public class Calc {     private double _pi;     private int _iters;     private readonly int TotalIters;     public Calc(int it) {         _iters = 1;         _pi = 0;         TotalIters = it;     }     public MyData PI {         get {             MyData pi = new MyData();             lock (this) {                 pi.pi = _pi;                 pi.iters = _iters;             }             return pi;         }     }     public Thread MakeThread() {         return new Thread(new ThreadStart(this.ThreadStarter));     }     private void calculate() {         double series = 0;         do {             series ++;             lock (this) {                 _iters += 4;                 _pi = series * 4;             }         } while (_iters < TotalIters);     }     private void ThreadStarter() {         try {             calculate();         } catch (ThreadAbortException e) {             Console.WriteLine("ThreadAbortException");         }     } } public class Form1 : System.Windows.Forms.Form {     private System.Windows.Forms.Label label1;     private System.Windows.Forms.TextBox PiValue;     private System.Windows.Forms.Label label2;     private System.Windows.Forms.TextBox Iteratons;     private Calc pi = new Calc(100000000);     private Thread calcThread = null;     private System.Windows.Forms.Timer timer1;     private System.Windows.Forms.Button StopButton;     private System.Windows.Forms.Button Pause;     private System.ComponentModel.IContainer components;     public Form1() {         this.label1 = new System.Windows.Forms.Label();         this.label2 = new System.Windows.Forms.Label();         this.Pause = new System.Windows.Forms.Button();         this.PiValue = new System.Windows.Forms.TextBox();         this.StopButton = new System.Windows.Forms.Button();         this.timer1 = new System.Windows.Forms.Timer(this.components);         this.Iteratons = new System.Windows.Forms.TextBox();         this.SuspendLayout();         //          // label1         //          this.label1.Location = new System.Drawing.Point(8, 24);         this.label1.Name = "label1";         this.label1.TabIndex = 0;         this.label1.Text = "Value  of PI:";         //          // label2         //          this.label2.Location = new System.Drawing.Point(8, 72);         this.label2.Name = "label2";         this.label2.TabIndex = 2;         this.label2.Text = "Iterations:";         //          // Pause         //          this.Pause.Location = new System.Drawing.Point(24, 112);         this.Pause.Name = "Pause";         this.Pause.TabIndex = 5;         this.Pause.Text = "Pause";         this.Pause.Click += new System.EventHandler(this.Pause_Click);         //          // PiValue         //          this.PiValue.Location = new System.Drawing.Point(128, 24);         this.PiValue.Name = "PiValue";         this.PiValue.ReadOnly = true;         this.PiValue.Size = new System.Drawing.Size(136, 20);         this.PiValue.TabIndex = 1;         this.PiValue.Text = "";         //          // StopButton         //          this.StopButton.Location = new System.Drawing.Point(200, 112);         this.StopButton.Name = "StopButton";         this.StopButton.TabIndex = 4;         this.StopButton.Text = "Stop";         this.StopButton.Click += new System.EventHandler(this.StopButton_Click);         //          this.timer1.Enabled = true;         this.timer1.Tick += new System.EventHandler(this.timer1_Tick);         //          this.Iteratons.Location = new System.Drawing.Point(128, 72);         this.Iteratons.Name = "Iteratons";         this.Iteratons.ReadOnly = true;         this.Iteratons.TabIndex = 3;         this.Iteratons.Text = "";         //          this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);         this.ClientSize = new System.Drawing.Size(292, 149);         this.Controls.AddRange(new System.Windows.Forms.Control[]  {                                                                   this.Pause,                                                                   this.StopButton,                                                                   this.Iteratons,                                                                   this.label2,                                                                   this.PiValue,                                                                   this.label1});         this.Load += new System.EventHandler(this.Form1_Load);         this.Closed += new System.EventHandler(this.Form1_Closed);         this.ResumeLayout(false);     }     [STAThread]     static void Main() {         Application.Run(new Form1());     }     private void Form1_Load(object sender, System.EventArgs e) {         calcThread = pi.MakeThread();         calcThread.Priority = ThreadPriority.Lowest;         calcThread.Start();     }     private void timer1_Tick(object sender, System.EventArgs e) {         if (this.Pause.Text == "Pause") {             MyData p = pi.PI;             this.PiValue.Text = p.pi.ToString();             this.Iteratons.Text = p.iters.ToString();         }         if (calcThread.IsAlive == false) {             StopButton.Enabled = false;             Pause.Enabled = false;             timer1.Enabled = false;             calcThread = null;         }     }     private void StopButton_Click(object sender, System.EventArgs e) {         StopButton.Enabled = false;         Pause.Enabled = false;         timer1.Enabled = false;         calcThread.Abort();         calcThread.Join();         calcThread = null;     }     private void Pause_Click(object sender, System.EventArgs e) {         if (this.Pause.Text == "Pause") {             calcThread.Suspend();             this.Pause.Text = "Resume";             this.StopButton.Enabled = false;         } else {             calcThread.Resume();             this.Pause.Text = "Pause";             this.StopButton.Enabled = true;         }     }     private void Form1_Closed(object sender, System.EventArgs e) {         if (calcThread != null) {             calcThread.Abort();             calcThread.Join();         }     } }