Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Drawing;
- using System.Collections;
- using System.ComponentModel;
- using System.Windows.Forms;
- using System.Data;
- using System.Threading;
- using System.Runtime.InteropServices;
- namespace MazeSolution
- {
- /// <summary>
- /// Summary description for frmMaze.
- /// </summary>
- public class frmMaze : System.Windows.Forms.Form
- {
- private IContainer components;
- // maze array
- private System.Drawing.Printing.PrintDocument printDocument1;
- private System.Windows.Forms.PrintPreviewDialog printPreviewDialog1;
- private System.Windows.Forms.MainMenu mainMenu1;
- private System.Windows.Forms.MenuItem menuItem1;
- private System.Windows.Forms.MenuItem PrintMenu;
- private System.Windows.Forms.MenuItem PreviewMenu;
- private System.Windows.Forms.MenuItem DimensionsMenu;
- private System.Windows.Forms.MenuItem menuItem3;
- private System.Windows.Forms.StatusBar statusBar;
- private System.Windows.Forms.MenuItem ResetMenu;
- private System.Windows.Forms.MenuItem SolveTwoThreads;
- private System.Windows.Forms.MenuItem SolveSingleThread;
- private System.Windows.Forms.MenuItem SolveFourThreads;
- private System.Windows.Forms.MenuItem SolveEightThreads;
- private System.Windows.Forms.MenuItem Solve16Threads;
- private System.Windows.Forms.MenuItem mnuExit;
- private System.Windows.Forms.MenuItem menuItem4;
- private Maze TheMaze = null;
- private int threads = 0;
- private int threadCount = 0;
- private System.Windows.Forms.MenuItem SolveThreadPool;
- private MenuItem menuItem2;
- private Label label1;
- private DateTime startTime;
- public frmMaze()
- {
- //
- // Required for Windows Form Designer support
- //
- InitializeComponent();
- SetStyle(ControlStyles.AllPaintingInWmPaint,true);
- SetStyle(ControlStyles.UserPaint,true);
- SetStyle(ControlStyles.DoubleBuffer,true);
- this.Cursor = Cursors.WaitCursor;
- TheMaze = new Maze();
- TheMaze.Generate();
- TheMaze.MazeSolutionComplete += new Maze.MazeEventHandler(MazeComplete);
- this.Cursor = Cursors.Default;
- SetBounds(this.Left, this.Top, (Maze.kDimension + 8) * Cell.kCellSize + Cell.PADDING, (Maze.kDimension + 12) * Cell.kCellSize + Cell.PADDING + statusBar.Height );
- }
- /// <summary>
- /// Clean up any resources being used.
- /// </summary>
- protected override void Dispose( bool disposing )
- {
- if( disposing )
- {
- if (components != null)
- {
- components.Dispose();
- }
- }
- base.Dispose( disposing );
- }
- /// <summary>
- /// The main entry point for the application.
- /// </summary>
- [STAThread]
- static void Main()
- {
- Application.Run(new frmMaze());
- }
- private void frmMaze_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
- {
- Graphics g = e.Graphics;
- g.FillRectangle(Brushes.White, ClientRectangle);
- TheMaze.Draw(g);
- }
- private void mnuExit_Click(object sender, System.EventArgs e)
- {
- this.Close();
- }
- private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
- {
- TheMaze.Draw(e.Graphics);
- }
- private void PreviewMenu_Click(object sender, System.EventArgs e)
- {
- this.printPreviewDialog1.ShowDialog();
- }
- private void PrintMenu_Click(object sender, System.EventArgs e)
- {
- printDocument1.Print();
- }
- private void DimensionsMenu_Click(object sender, System.EventArgs e)
- {
- DimensionsDialog theDialog = new DimensionsDialog();
- theDialog.numericUpDown1.Value = Maze.kDimension;
- // theDialog.numericUpDown2.Value = Cell.kCellSize;
- if (theDialog.ShowDialog() == DialogResult.OK)
- {
- label1.Location = new Point(22, 22);
- Maze.kDimension = (int)theDialog.numericUpDown1.Value;
- // Cell.kCellSize = (int)theDialog.numericUpDown2.Value;
- TheMaze.Initialize();
- TheMaze.Generate();
- SetBounds(this.Left, this.Top, (Maze.kDimension + 8) * Cell.kCellSize + Cell.PADDING, (Maze.kDimension + 12) * Cell.kCellSize + Cell.PADDING + statusBar.Height );
- Invalidate();
- }
- }
- private void ResetMenu_Click(object sender, System.EventArgs e)
- {
- statusBar.Text = "";
- TheMaze.Reset();
- this.Refresh();
- }
- private void SolveSingleThread_Click(object sender, System.EventArgs e)
- {
- // Initialize all necessary variables
- threads = 1;
- threadCount = 0;
- statusBar.Text = "";
- // Clear the maze and refresh the form before we start the clock
- TheMaze.Reset();
- this.Refresh();
- // Set the cursor and start the clock
- this.Cursor = Cursors.WaitCursor;
- startTime = DateTime.Now;
- // Create one thread and start it running
- Thread aThread = new Thread(new ThreadStart(TheMaze.SolveA));
- aThread.Start();
- }
- private void SolveTwoThreads_Click(object sender, System.EventArgs e)
- {
- // Run the code for a single thread...
- SolveSingleThread_Click(sender, e);
- threads = 2;
- // And add one more thread
- Thread bThread = new Thread(new ThreadStart(TheMaze.SolveB));
- bThread.Start();
- }
- private void SolveFourThreads_Click(object sender, System.EventArgs e)
- {
- SolveTwoThreads_Click(sender, e);
- threads = 4;
- // Add two additional threads
- Thread cThread = new Thread(new ThreadStart(TheMaze.SolveC));
- Thread dThread = new Thread(new ThreadStart(TheMaze.SolveD));
- cThread.Start();
- dThread.Start();
- }
- private void SolveEightThreads_Click(object sender, System.EventArgs e)
- {
- SolveFourThreads_Click(sender, e);
- threads = 8;
- // Add four additional threads
- Thread eThread = new Thread(new ThreadStart(TheMaze.SolveE));
- Thread fThread = new Thread(new ThreadStart(TheMaze.SolveF));
- Thread gThread = new Thread(new ThreadStart(TheMaze.SolveG));
- Thread hThread = new Thread(new ThreadStart(TheMaze.SolveH));
- eThread.Start();
- fThread.Start();
- gThread.Start();
- hThread.Start();
- }
- private void Solve16Threads_Click(object sender, System.EventArgs e)
- {
- SolveEightThreads_Click(sender, e);
- threads = 16;
- // Add eight additional threads
- Thread iThread = new Thread(new ThreadStart(TheMaze.SolveI));
- Thread jThread = new Thread(new ThreadStart(TheMaze.SolveJ));
- Thread kThread = new Thread(new ThreadStart(TheMaze.SolveK));
- Thread lThread = new Thread(new ThreadStart(TheMaze.SolveL));
- Thread mThread = new Thread(new ThreadStart(TheMaze.SolveM));
- Thread nThread = new Thread(new ThreadStart(TheMaze.SolveN));
- Thread oThread = new Thread(new ThreadStart(TheMaze.SolveO));
- Thread pThread = new Thread(new ThreadStart(TheMaze.SolveP));
- iThread.Start();
- jThread.Start();
- kThread.Start();
- lThread.Start();
- mThread.Start();
- nThread.Start();
- oThread.Start();
- pThread.Start();
- }
- private void SolveThreadPool_Click(object sender, System.EventArgs e)
- {
- // Reset all necessary variables
- threads = 8;
- threadCount = 0;
- statusBar.Text = "";
- // Clear the maze and refresh the form
- TheMaze.Reset();
- this.Refresh();
- // Start the clock and queue up 8 threads for execution
- this.Cursor = Cursors.WaitCursor;
- startTime = DateTime.Now;
- ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadFuncA));
- ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadFuncB));
- ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadFuncC));
- ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadFuncD));
- ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadFuncE));
- ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadFuncF));
- ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadFuncG));
- ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadFuncH));
- }
- private void ThreadFuncA(Object O)
- {
- TheMaze.SolveA();
- }
- private void ThreadFuncB(Object O)
- {
- TheMaze.SolveB();
- }
- private void ThreadFuncC(Object O)
- {
- TheMaze.SolveC();
- }
- private void ThreadFuncD(Object O)
- {
- TheMaze.SolveD();
- }
- private void ThreadFuncE(Object O)
- {
- TheMaze.SolveE();
- }
- private void ThreadFuncF(Object O)
- {
- TheMaze.SolveF();
- }
- private void ThreadFuncG(Object O)
- {
- TheMaze.SolveG();
- }
- private void ThreadFuncH(Object O)
- {
- TheMaze.SolveH();
- }
- private void MazeComplete(object sender, EventArgs e)
- {
- // Roll call for the threads
- threadCount++;
- // When they all call in, we know we're done so put up the results
- if( threadCount == threads )
- {
- this.Refresh();
- statusBar.Text = "Completed using " + " threads in " + (DateTime.Now - startTime);
- this.Cursor = Cursors.Default;
- }
- }
- protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
- {
- // MazeSolution.Cell Cells = new MazeSolution.Cell masWall[x][y];
- //capture up arrow key
- if (keyData == Keys.Up && )
- {
- label1.Top += -2;
- return true;
- }
- //capture down arrow key
- if (keyData == Keys.Down)
- {
- label1.Top += 2;
- return true;
- }
- //capture left arrow key
- if (keyData == Keys.Left)
- {
- label1.Left += -2;
- return true;
- }
- //capture right arrow key
- if (keyData == Keys.Right)
- {
- label1.Left += 2;
- return true;
- }
- return base.ProcessCmdKey(ref msg, keyData);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement