Advertisement
Guest User

frmMaze.cs

a guest
Dec 1st, 2016
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.36 KB | None | 0 0
  1. using System;
  2. using System.Drawing;
  3. using System.Collections;
  4. using System.ComponentModel;
  5. using System.Windows.Forms;
  6. using System.Data;
  7. using System.Threading;
  8. using System.Runtime.InteropServices;
  9. namespace MazeSolution
  10. {
  11. /// <summary>
  12. /// Summary description for frmMaze.
  13. /// </summary>
  14. public class frmMaze : System.Windows.Forms.Form
  15. {
  16. private IContainer components;
  17. // maze array
  18. private System.Drawing.Printing.PrintDocument printDocument1;
  19. private System.Windows.Forms.PrintPreviewDialog printPreviewDialog1;
  20. private System.Windows.Forms.MainMenu mainMenu1;
  21. private System.Windows.Forms.MenuItem menuItem1;
  22. private System.Windows.Forms.MenuItem PrintMenu;
  23. private System.Windows.Forms.MenuItem PreviewMenu;
  24. private System.Windows.Forms.MenuItem DimensionsMenu;
  25. private System.Windows.Forms.MenuItem menuItem3;
  26. private System.Windows.Forms.StatusBar statusBar;
  27. private System.Windows.Forms.MenuItem ResetMenu;
  28. private System.Windows.Forms.MenuItem SolveTwoThreads;
  29. private System.Windows.Forms.MenuItem SolveSingleThread;
  30. private System.Windows.Forms.MenuItem SolveFourThreads;
  31. private System.Windows.Forms.MenuItem SolveEightThreads;
  32. private System.Windows.Forms.MenuItem Solve16Threads;
  33. private System.Windows.Forms.MenuItem mnuExit;
  34. private System.Windows.Forms.MenuItem menuItem4;
  35. private Maze TheMaze = null;
  36. private int threads = 0;
  37. private int threadCount = 0;
  38. private System.Windows.Forms.MenuItem SolveThreadPool;
  39. private MenuItem menuItem2;
  40. private Label label1;
  41. private DateTime startTime;
  42. public frmMaze()
  43. {
  44. //
  45. // Required for Windows Form Designer support
  46. //
  47. InitializeComponent();
  48. SetStyle(ControlStyles.AllPaintingInWmPaint,true);
  49. SetStyle(ControlStyles.UserPaint,true);
  50. SetStyle(ControlStyles.DoubleBuffer,true);
  51. this.Cursor = Cursors.WaitCursor;
  52. TheMaze = new Maze();
  53. TheMaze.Generate();
  54. TheMaze.MazeSolutionComplete += new Maze.MazeEventHandler(MazeComplete);
  55. this.Cursor = Cursors.Default;
  56. SetBounds(this.Left, this.Top, (Maze.kDimension + 8) * Cell.kCellSize + Cell.PADDING, (Maze.kDimension + 12) * Cell.kCellSize + Cell.PADDING + statusBar.Height );
  57. }
  58. /// <summary>
  59. /// Clean up any resources being used.
  60. /// </summary>
  61. protected override void Dispose( bool disposing )
  62. {
  63. if( disposing )
  64. {
  65. if (components != null)
  66. {
  67. components.Dispose();
  68. }
  69. }
  70. base.Dispose( disposing );
  71. }
  72.  
  73. /// <summary>
  74. /// The main entry point for the application.
  75. /// </summary>
  76. [STAThread]
  77. static void Main()
  78. {
  79. Application.Run(new frmMaze());
  80.  
  81. }
  82. private void frmMaze_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
  83. {
  84. Graphics g = e.Graphics;
  85. g.FillRectangle(Brushes.White, ClientRectangle);
  86. TheMaze.Draw(g);
  87. }
  88. private void mnuExit_Click(object sender, System.EventArgs e)
  89. {
  90. this.Close();
  91. }
  92. private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
  93. {
  94. TheMaze.Draw(e.Graphics);
  95. }
  96. private void PreviewMenu_Click(object sender, System.EventArgs e)
  97. {
  98. this.printPreviewDialog1.ShowDialog();
  99. }
  100. private void PrintMenu_Click(object sender, System.EventArgs e)
  101. {
  102. printDocument1.Print();
  103. }
  104. private void DimensionsMenu_Click(object sender, System.EventArgs e)
  105. {
  106. DimensionsDialog theDialog = new DimensionsDialog();
  107. theDialog.numericUpDown1.Value = Maze.kDimension;
  108. // theDialog.numericUpDown2.Value = Cell.kCellSize;
  109. if (theDialog.ShowDialog() == DialogResult.OK)
  110. {
  111. label1.Location = new Point(22, 22);
  112. Maze.kDimension = (int)theDialog.numericUpDown1.Value;
  113. // Cell.kCellSize = (int)theDialog.numericUpDown2.Value;
  114. TheMaze.Initialize();
  115. TheMaze.Generate();
  116. SetBounds(this.Left, this.Top, (Maze.kDimension + 8) * Cell.kCellSize + Cell.PADDING, (Maze.kDimension + 12) * Cell.kCellSize + Cell.PADDING + statusBar.Height );
  117. Invalidate();
  118. }
  119. }
  120. private void ResetMenu_Click(object sender, System.EventArgs e)
  121. {
  122. statusBar.Text = "";
  123. TheMaze.Reset();
  124. this.Refresh();
  125. }
  126. private void SolveSingleThread_Click(object sender, System.EventArgs e)
  127. {
  128. // Initialize all necessary variables
  129. threads = 1;
  130. threadCount = 0;
  131. statusBar.Text = "";
  132. // Clear the maze and refresh the form before we start the clock
  133. TheMaze.Reset();
  134. this.Refresh();
  135. // Set the cursor and start the clock
  136. this.Cursor = Cursors.WaitCursor;
  137. startTime = DateTime.Now;
  138. // Create one thread and start it running
  139. Thread aThread = new Thread(new ThreadStart(TheMaze.SolveA));
  140. aThread.Start();
  141. }
  142. private void SolveTwoThreads_Click(object sender, System.EventArgs e)
  143. {
  144. // Run the code for a single thread...
  145. SolveSingleThread_Click(sender, e);
  146. threads = 2;
  147. // And add one more thread
  148. Thread bThread = new Thread(new ThreadStart(TheMaze.SolveB));
  149. bThread.Start();
  150. }
  151. private void SolveFourThreads_Click(object sender, System.EventArgs e)
  152. {
  153. SolveTwoThreads_Click(sender, e);
  154. threads = 4;
  155. // Add two additional threads
  156. Thread cThread = new Thread(new ThreadStart(TheMaze.SolveC));
  157. Thread dThread = new Thread(new ThreadStart(TheMaze.SolveD));
  158. cThread.Start();
  159. dThread.Start();
  160. }
  161. private void SolveEightThreads_Click(object sender, System.EventArgs e)
  162. {
  163. SolveFourThreads_Click(sender, e);
  164. threads = 8;
  165. // Add four additional threads
  166. Thread eThread = new Thread(new ThreadStart(TheMaze.SolveE));
  167. Thread fThread = new Thread(new ThreadStart(TheMaze.SolveF));
  168. Thread gThread = new Thread(new ThreadStart(TheMaze.SolveG));
  169. Thread hThread = new Thread(new ThreadStart(TheMaze.SolveH));
  170. eThread.Start();
  171. fThread.Start();
  172. gThread.Start();
  173. hThread.Start();
  174. }
  175. private void Solve16Threads_Click(object sender, System.EventArgs e)
  176. {
  177. SolveEightThreads_Click(sender, e);
  178. threads = 16;
  179. // Add eight additional threads
  180. Thread iThread = new Thread(new ThreadStart(TheMaze.SolveI));
  181. Thread jThread = new Thread(new ThreadStart(TheMaze.SolveJ));
  182. Thread kThread = new Thread(new ThreadStart(TheMaze.SolveK));
  183. Thread lThread = new Thread(new ThreadStart(TheMaze.SolveL));
  184. Thread mThread = new Thread(new ThreadStart(TheMaze.SolveM));
  185. Thread nThread = new Thread(new ThreadStart(TheMaze.SolveN));
  186. Thread oThread = new Thread(new ThreadStart(TheMaze.SolveO));
  187. Thread pThread = new Thread(new ThreadStart(TheMaze.SolveP));
  188. iThread.Start();
  189. jThread.Start();
  190. kThread.Start();
  191. lThread.Start();
  192. mThread.Start();
  193. nThread.Start();
  194. oThread.Start();
  195. pThread.Start();
  196. }
  197.  
  198. private void SolveThreadPool_Click(object sender, System.EventArgs e)
  199. {
  200. // Reset all necessary variables
  201. threads = 8;
  202. threadCount = 0;
  203. statusBar.Text = "";
  204. // Clear the maze and refresh the form
  205. TheMaze.Reset();
  206. this.Refresh();
  207. // Start the clock and queue up 8 threads for execution
  208. this.Cursor = Cursors.WaitCursor;
  209. startTime = DateTime.Now;
  210. ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadFuncA));
  211. ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadFuncB));
  212. ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadFuncC));
  213. ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadFuncD));
  214. ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadFuncE));
  215. ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadFuncF));
  216. ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadFuncG));
  217. ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadFuncH));
  218. }
  219. private void ThreadFuncA(Object O)
  220. {
  221. TheMaze.SolveA();
  222. }
  223. private void ThreadFuncB(Object O)
  224. {
  225. TheMaze.SolveB();
  226. }
  227. private void ThreadFuncC(Object O)
  228. {
  229. TheMaze.SolveC();
  230. }
  231. private void ThreadFuncD(Object O)
  232. {
  233. TheMaze.SolveD();
  234. }
  235. private void ThreadFuncE(Object O)
  236. {
  237. TheMaze.SolveE();
  238. }
  239. private void ThreadFuncF(Object O)
  240. {
  241. TheMaze.SolveF();
  242. }
  243. private void ThreadFuncG(Object O)
  244. {
  245. TheMaze.SolveG();
  246. }
  247. private void ThreadFuncH(Object O)
  248. {
  249. TheMaze.SolveH();
  250. }
  251. private void MazeComplete(object sender, EventArgs e)
  252. {
  253. // Roll call for the threads
  254. threadCount++;
  255. // When they all call in, we know we're done so put up the results
  256. if( threadCount == threads )
  257. {
  258. this.Refresh();
  259.  
  260. statusBar.Text = "Completed using " + " threads in " + (DateTime.Now - startTime);
  261. this.Cursor = Cursors.Default;
  262. }
  263. }
  264. protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
  265. {
  266. // MazeSolution.Cell Cells = new MazeSolution.Cell masWall[x][y];
  267.  
  268. //capture up arrow key
  269. if (keyData == Keys.Up && )
  270. {
  271. label1.Top += -2;
  272. return true;
  273. }
  274. //capture down arrow key
  275. if (keyData == Keys.Down)
  276. {
  277. label1.Top += 2;
  278. return true;
  279. }
  280. //capture left arrow key
  281. if (keyData == Keys.Left)
  282. {
  283. label1.Left += -2;
  284. return true;
  285. }
  286. //capture right arrow key
  287. if (keyData == Keys.Right)
  288. {
  289. label1.Left += 2;
  290. return true;
  291. }
  292. return base.ProcessCmdKey(ref msg, keyData);
  293. }
  294.  
  295.  
  296.  
  297.  
  298. }
  299. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement