📄 frmmaze.cs
字号:
this.Controls.AddRange(new System.Windows.Forms.Control[] {
this.statusBar});
this.Menu = this.mainMenu1;
this.Name = "frmMaze";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Solve Mazes with Multiple Threads";
this.Paint += new System.Windows.Forms.PaintEventHandler(this.frmMaze_Paint);
this.ResumeLayout(false);
}
#endregion
/// <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)
{
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 + " threads in " + (DateTime.Now - startTime);
this.Cursor = Cursors.Default;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -