1、实验报告六攀 枝 花 学 院 实 验 报 告实验课程:Visual C#.NET程序设计教程 实验项目:上机实验9 实验日期:2015.05.26系:数计学院 成绩: 1、实验目的1.理解线程的概念。2.了解线程的状态和生命周期。3.掌握使用Thread类来创建线程的方法。4.理解线程同步的含义,掌握线程同步的方法。二、实验要求1.熟悉Visual Studio.Net2010的基本操作方法。2.认真阅读本章相关内容,尤其是案例。3.实验前进行程序设计,完成源程序的编写任务。4.反复操作,直到不需要参考教材、能熟练操作为止。 3、实验步骤1.设计一个Windows应用程序,用多线程实现一个简单
2、的计算器,用来计算指定范围内数中素数的个数,并用sendmessage 发送消息返回素数的个数并显示进度。源程序如下:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Threading;namespace MultiThreadDemo public partial c
3、lass MainFrom : Form private Primes p; public MainFrom() InitializeComponent(); private void btnOK_Click(object sender, EventArgs e) p = new Primes(Convert.ToInt32(this.textBox1.Text.Trim(); p.OnStart += new Primes.ComputeStart(p_OnStart); p.OnFinished += new Primes.ComputeFinished(p_OnFinished); Th
4、read bkThread = new Thread(new ParameterizedThreadStart(ThreadProc); bkThread.Start(new ThreadParam(this.Handle); public void ThreadProc(object objParams) ThreadParam param = objParams as ThreadParam; p.ComputePrimeNum(param); void p_OnFinished(int _primeNum) this.lblShow.Text = string.Format(The pr
5、ime number is: 0,_primeNum); void p_OnStart() this.lblShow.Text = Compute started.; this.pgbCompute.Maximum = p.MaxNum; this.pgbCompute.Minimum = 0; void p_OnProgress(int _prog) this.pgbCompute.Value = _prog; protected override void DefWndProc(ref Message m) switch (m.Msg) case Win32.WM_COMPUTESTART
6、: p_OnStart(); return; case Win32.WM_COMPUTEPROGRESS: p_OnProgress(int)m.LParam); return; case Win32.WM_COMPUTEFINISHED: p_OnFinished(int)m.LParam); return; base.DefWndProc(ref m); prime类using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespac
7、e MultiThreadDemo class Prime public static bool IsPrime(int _num) for (int i = 2; i _num/2; i+) if (_num % i = 0) return false; return true; public class Primes private int _primeNum = 0; private int _maxNum; public delegate void ComputeStart(); public delegate void ComputeFinished(int _primeNum);
8、public event ComputeStart OnStart; public event ComputeFinished OnFinished; public Primes(int maxNum) _maxNum = maxNum; public int MaxNum get return _maxNum; public void ComputePrimeNum(ThreadParam param) IntPtr hWnd=param.MainWndHandle; Win32.PostMessage(hWnd, Win32.WM_COMPUTESTART, IntPtr.Zero, In
9、tPtr.Zero); for (int i = 2; i =_maxNum; i+) Win32.PostMessage(hWnd, Win32.WM_COMPUTECANCELED, IntPtr.Zero, IntPtr.Zero); if (Prime.IsPrime(i) _primeNum+; if(i%(_maxNum/100)=0) Win32.SendMessage(hWnd, Win32.WM_COMPUTEPROGRESS, IntPtr.Zero, (IntPtr)i); Win32.SendMessage(hWnd, Win32.WM_COMPUTEFINISHED,
10、 IntPtr.Zero, (IntPtr)_primeNum); Win32类using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Runtime.InteropServices;namespace MultiThreadDemo public class Win32 public const int WM_COMPUTESTART = 0x0400 + 1; public const int WM_COMPUTEFINISHED = 0x0400 + 2;
11、 public const int WM_COMPUTEPROGRESS = 0x0400 + 3; public const int WM_COMPUTECANCELED = 0x0400 + 4; DllImport(User32.dll) public extern static bool PostMessage(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam); DllImport(User32.dll) public extern static int SendMessage(IntPtr hWnd, UInt32 msg,
12、 IntPtr wParam, IntPtr lParam); Thread类using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace MultiThreadDemo public class ThreadParam private IntPtr _mainWndHandle; public IntPtr MainWndHandle get return _mainWndHandle; public ThreadParam(
13、IntPtr handle) _mainWndHandle = handle; 运行结果如图所示:2、设计一个Windows应用程序,用多线程实现一个简单的计算器,用来计算指定范围内数中素数的个数,并用postmessage 发送消息返回素数的个数并显示进度。源程序如下:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace MultiThreadDemo class Prime public static bool Is
14、Prime(int _num) for (int i = 2; i _num/2; i+) if (_num % i = 0) return false; return true; public class Primes private int _primeNum = 0; private int _maxNum; public delegate void ComputeStart(); public delegate void ComputeFinished(int _primeNum); public event ComputeStart OnStart; public event Com
15、puteFinished OnFinished; public Primes(int maxNum) _maxNum = maxNum; public int MaxNum get return _maxNum; public void ComputePrimeNum(ThreadParam param) IntPtr hWnd=param.MainWndHandle; Win32.PostMessage(hWnd, Win32.WM_COMPUTESTART, IntPtr.Zero, IntPtr.Zero); for (int i = 2; i _maxNum; i+) Win32.Po
16、stMessage(hWnd, Win32.WM_COMPUTECANCELED, IntPtr.Zero, IntPtr.Zero); if (Prime.IsPrime(i) _primeNum+; if(i%(_maxNum/100)=0) Win32.PostMessage(hWnd, Win32.WM_COMPUTEPROGRESS, IntPtr.Zero, (IntPtr)i); Win32.PostMessage(hWnd, Win32.WM_COMPUTEFINISHED, IntPtr.Zero, (IntPtr)_primeNum); 只改变prime类中的sendmes
17、sage为postmessage即可,其余代码不变。运行结果如图所示:3、设计一个Windows应用程序,用多线程实现一个简单的计算器,用来计算指定范围内数中素数的个数,并用sendmessage 发送消息返回素数的个数并显示进度,并用aotoresetevent.重置事件,实现主线程对辅助线程的通信。源程序如下:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using Syste
18、m.Text;using System.Windows.Forms;using System.Threading;namespace MultiThreadDemo public partial class MainFrom : Form private Primes p; private AutoResetEvent _eventCancel; public MainFrom() InitializeComponent(); protected override void OnLoad(EventArgs e) base.OnLoad(e); private void btnOK_Click
19、(object sender, EventArgs e) p = new Primes(Convert.ToInt32(this.textBox1.Text.Trim(); p.OnStart += new Primes.ComputeStart(p_OnStart); p.OnFinished += new Primes.ComputeFinished(p_OnFinished); p.OnCanceled += new Primes.ComputeCanceled(p_OnCanceled); p.OnProgress+=new Primes.ComputeProgress(p_OnPro
20、gress); if (btnOK.Text = OK) Thread bkThread = new Thread(new ParameterizedThreadStart(ThreadProc); _eventCancel = new AutoResetEvent(false); bkThread.Start(new ThreadParam(this.Handle, _eventCancel); else _eventCancel.Set(); public void ThreadProc(object objParams) ThreadParam param = objParams as
21、ThreadParam; p.ComputePrimeNum(param); void p_OnCanceled() btnOK.Text = OK; this.lblShow.Text = The computing is canceled!; void p_OnFinished(int _primeNum) this.lblShow.Text = string.Format(The prime number is: 0,_primeNum); btnOK.Text = OK; void p_OnStart() this.lblShow.Text = Compute started.; bt
22、nOK.Text = Cancel; this.pgbCompute.Maximum = p.MaxNum; this.pgbCompute.Minimum = 0; void p_OnProgress(int _prog) this.pgbCompute.Value = _prog; protected override void DefWndProc(ref Message m) switch (m.Msg) case Win32.WM_COMPUTESTART: p_OnStart(); return; case Win32.WM_COMPUTEPROGRESS: p_OnProgres
23、s(int)m.LParam); return; case Win32.WM_COMPUTEFINISHED: p_OnFinished(int)m.LParam); return; case Win32.WM_COMPUTECANCELED: p_OnCanceled(); return; base.DefWndProc(ref m); 类prime代码:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.Wi
24、ndows.Forms;namespace MultiThreadDemo class Prime public static bool IsPrime(int _num) for (int i = 2; i _num/2; i+) if (_num % i = 0) return false; return true; public class Primes private int _primeNum = 0; private int _maxNum; public delegate void ComputeStart(); public delegate void ComputeFinis
25、hed(int _primeNum); public delegate void ComputeCanceled(); public delegate void ComputeProgress(int _prog); public event ComputeStart OnStart; public event ComputeFinished OnFinished; public event ComputeCanceled OnCanceled; public event ComputeProgress OnProgress; public Primes(int maxNum) _maxNum
26、 = maxNum; public int MaxNum get return _maxNum; public void ComputePrimeNum(ThreadParam param) IntPtr hWnd=param.MainWndHandle; AutoResetEvent eventCancel = param.EventCancel; Control mainFrame = Control.FromHandle(hWnd); if(OnStart!=null & mainFrame.IsDisposed=false) mainFrame.BeginInvoke(OnStart)
27、; for (int i = 2; i _maxNum; i+) if (eventCancel.WaitOne(0) if (OnCanceled != null & mainFrame.IsDisposed = false) mainFrame.BeginInvoke(OnCanceled); return; if (Prime.IsPrime(i) _primeNum+; if (i % (_maxNum / 100) = 0 & OnProgress != null & mainFrame.IsDisposed = false) mainFrame.BeginInvoke(OnProg
28、ress, new objecti); if (OnFinished != null) mainFrame.BeginInvoke(OnFinished, new object_primeNum); 类win32,thread,代码与上面相同。4.设计一个Windows应用程序,用多线程实现一个简单的计算器,用来计算指定范围内数中素数的个数,并用bgininvoke 发送消息返回素数的个数并显示进度,实现主线程和辅助线程之间的通信。源程序如下:Win32代码:using System;using System.Collections.Generic;using System.Linq;usin
29、g System.Text;using System.Runtime.InteropServices;namespace MultiThreadDemo public class Win32 public const int WM_COMPUTESTART = 0x0400 + 1; public const int WM_COMPUTEFINISHED = 0x0400 + 2; public const int WM_COMPUTEPROGRESS = 0x0400 + 3; public const int WM_COMPUTECANCELED = 0x0400 + 4; Primes类代码:using System;using System.Collections.Generic;using System.Linq;us
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1