实验报告六.docx
- 文档编号:26794609
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:23
- 大小:45.94KB
实验报告六.docx
《实验报告六.docx》由会员分享,可在线阅读,更多相关《实验报告六.docx(23页珍藏版)》请在冰豆网上搜索。
实验报告六
攀枝花学院实验报告
实验课程:
VisualC#.NET程序设计教程实验项目:
上机实验9实验日期:
2015.05.26
系:
数计学院成绩:
1、实验目的
1.理解线程的概念。
2.了解线程的状态和生命周期。
3.掌握使用Thread类来创建线程的方法。
4.理解线程同步的含义,掌握线程同步的方法。
二、实验要求
1.熟悉VisualStudio.Net2010的基本操作方法。
2.认真阅读本章相关内容,尤其是案例。
3.实验前进行程序设计,完成源程序的编写任务。
4.反复操作,直到不需要参考教材、能熟练操作为止。
3、实验步骤
1.设计一个Windows应用程序,用多线程实现一个简单的计算器,用来计算指定范围内数中素数的个数,并用sendmessage发送消息返回素数的个数并显示进度。
源程序如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Threading;
namespaceMultiThreadDemo
{
publicpartialclassMainFrom:
Form
{
privatePrimesp;
publicMainFrom()
{
InitializeComponent();
}
privatevoidbtnOK_Click(objectsender,EventArgse)
{
p=newPrimes(Convert.ToInt32(this.textBox1.Text.Trim()));
p.OnStart+=newPrimes.ComputeStart(p_OnStart);
p.OnFinished+=newPrimes.ComputeFinished(p_OnFinished);
ThreadbkThread=newThread(newParameterizedThreadStart(ThreadProc));
bkThread.Start(newThreadParam(this.Handle));
}
publicvoidThreadProc(objectobjParams)
{
ThreadParamparam=objParamsasThreadParam;
p.ComputePrimeNum(param);
}
voidp_OnFinished(int_primeNum)
{
this.lblShow.Text=string.Format("Theprimenumberis:
{0}",_primeNum);
}
voidp_OnStart()
{
this.lblShow.Text="Computestarted...";
this.pgbCompute.Maximum=p.MaxNum;
this.pgbCompute.Minimum=0;
}
voidp_OnProgress(int_prog)
{
this.pgbCompute.Value=_prog;
}
protectedoverridevoidDefWndProc(refMessagem)
{
switch(m.Msg)
{
caseWin32.WM_COMPUTESTART:
p_OnStart();
return;
caseWin32.WM_COMPUTEPROGRESS:
p_OnProgress((int)m.LParam);
return;
caseWin32.WM_COMPUTEFINISHED:
p_OnFinished((int)m.LParam);
return;
}
base.DefWndProc(refm);
}
}
}
prime类
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading;
namespaceMultiThreadDemo
{
classPrime
{
publicstaticboolIsPrime(int_num)
{
for(inti=2;i<_num/2;i++)
{
if(_num%i==0)
returnfalse;
}
returntrue;
}
}
publicclassPrimes
{
privateint_primeNum=0;
privateint_maxNum;
publicdelegatevoidComputeStart();
publicdelegatevoidComputeFinished(int_primeNum);
publiceventComputeStartOnStart;
publiceventComputeFinishedOnFinished;
publicPrimes(intmaxNum)
{
_maxNum=maxNum;
}
publicintMaxNum
{
get
{
return_maxNum;
}
}
publicvoidComputePrimeNum(ThreadParamparam)
{
IntPtrhWnd=param.MainWndHandle;
Win32.PostMessage(hWnd,Win32.WM_COMPUTESTART,IntPtr.Zero,IntPtr.Zero);
for(inti=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,IntPtr.Zero,(IntPtr)_primeNum);
}
}
}
Win32类
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Runtime.InteropServices;
namespaceMultiThreadDemo
{
publicclassWin32
{
publicconstintWM_COMPUTESTART=0x0400+1;
publicconstintWM_COMPUTEFINISHED=0x0400+2;
publicconstintWM_COMPUTEPROGRESS=0x0400+3;
publicconstintWM_COMPUTECANCELED=0x0400+4;
[DllImport("User32.dll")]
publicexternstaticboolPostMessage(IntPtrhWnd,UInt32msg,IntPtrwParam,IntPtrlParam);
[DllImport("User32.dll")]
publicexternstaticintSendMessage(IntPtrhWnd,UInt32msg,IntPtrwParam,IntPtrlParam);
}
}
Thread类
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading;
namespaceMultiThreadDemo
{
publicclassThreadParam
{
privateIntPtr_mainWndHandle;
publicIntPtrMainWndHandle
{
get
{
return_mainWndHandle;
}
}
publicThreadParam(IntPtrhandle)
{
_mainWndHandle=handle;
}
}
}
运行结果如图所示:
2、设计一个Windows应用程序,用多线程实现一个简单的计算器,用来计算指定范围内数中素数的个数,并用postmessage发送消息返回素数的个数并显示进度。
源程序如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading;
namespaceMultiThreadDemo
{
classPrime
{
publicstaticboolIsPrime(int_num)
{
for(inti=2;i<_num/2;i++)
{
if(_num%i==0)
returnfalse;
}
returntrue;
}
}
publicclassPrimes
{
privateint_primeNum=0;
privateint_maxNum;
publicdelegatevoidComputeStart();
publicdelegatevoidComputeFinished(int_primeNum);
publiceventComputeStartOnStart;
publiceventComputeFinishedOnFinished;
publicPrimes(intmaxNum)
{
_maxNum=maxNum;
}
publicintMaxNum
{
get
{
return_maxNum;
}
}
publicvoidComputePrimeNum(ThreadParamparam)
{
IntPtrhWnd=param.MainWndHandle;
Win32.PostMessage(hWnd,Win32.WM_COMPUTESTART,IntPtr.Zero,IntPtr.Zero);
for(inti=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.PostMessage(hWnd,Win32.WM_COMPUTEPROGRESS,IntPtr.Zero,(IntPtr)i);
}
Win32.PostMessage(hWnd,Win32.WM_COMPUTEFINISHED,IntPtr.Zero,(IntPtr)_primeNum);
}
}
}
只改变prime类中的sendmessage为postmessage即可,其余代码不变。
运行结果如图所示:
3、设计一个Windows应用程序,用多线程实现一个简单的计算器,用来计算指定范围内数中素数的个数,并用sendmessage发送消息返回素数的个数并显示进度,并用aotoresetevent.
重置事件,实现主线程对辅助线程的通信。
源程序如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Threading;
namespaceMultiThreadDemo
{
publicpartialclassMainFrom:
Form
{
privatePrimesp;
privateAutoResetEvent_eventCancel;
publicMainFrom()
{
InitializeComponent();
}
protectedoverridevoidOnLoad(EventArgse)
{
base.OnLoad(e);
}
privatevoidbtnOK_Click(objectsender,EventArgse)
{
p=newPrimes(Convert.ToInt32(this.textBox1.Text.Trim()));
p.OnStart+=newPrimes.ComputeStart(p_OnStart);
p.OnFinished+=newPrimes.ComputeFinished(p_OnFinished);
p.OnCanceled+=newPrimes.ComputeCanceled(p_OnCanceled);
p.OnProgress+=newPrimes.ComputeProgress(p_OnProgress);
if(btnOK.Text=="OK")
{
ThreadbkThread=newThread(newParameterizedThreadStart(ThreadProc));
_eventCancel=newAutoResetEvent(false);
bkThread.Start(newThreadParam(this.Handle,_eventCancel));
}
else
{
_eventCancel.Set();
}
}
publicvoidThreadProc(objectobjParams)
{
ThreadParamparam=objParamsasThreadParam;
p.ComputePrimeNum(param);
}
voidp_OnCanceled()
{
btnOK.Text="OK";
this.lblShow.Text="Thecomputingiscanceled!
";
}
voidp_OnFinished(int_primeNum)
{
this.lblShow.Text=string.Format("Theprimenumberis:
{0}",_primeNum);
btnOK.Text="OK";
}
voidp_OnStart()
{
this.lblShow.Text="Computestarted...";
btnOK.Text="Cancel";
this.pgbCompute.Maximum=p.MaxNum;
this.pgbCompute.Minimum=0;
}
voidp_OnProgress(int_prog)
{
this.pgbCompute.Value=_prog;
}
protectedoverridevoidDefWndProc(refMessagem)
{
switch(m.Msg)
{
caseWin32.WM_COMPUTESTART:
p_OnStart();
return;
caseWin32.WM_COMPUTEPROGRESS:
p_OnProgress((int)m.LParam);
return;
caseWin32.WM_COMPUTEFINISHED:
p_OnFinished((int)m.LParam);
return;
caseWin32.WM_COMPUTECANCELED:
p_OnCanceled();
return;
}
base.DefWndProc(refm);
}
}
}
类prime代码:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading;
usingSystem.Windows.Forms;
namespaceMultiThreadDemo
{
classPrime
{
publicstaticboolIsPrime(int_num)
{
for(inti=2;i<_num/2;i++)
{
if(_num%i==0)
returnfalse;
}
returntrue;
}
}
publicclassPrimes
{
privateint_primeNum=0;
privateint_maxNum;
publicdelegatevoidComputeStart();
publicdelegatevoidComputeFinished(int_primeNum);
publicdelegatevoidComputeCanceled();
publicdelegatevoidComputeProgress(int_prog);
publiceventComputeStartOnStart;
publiceventComputeFinishedOnFinished;
publiceventComputeCanceledOnCanceled;
publiceventComputeProgressOnProgress;
publicPrimes(intmaxNum)
{
_maxNum=maxNum;
}
publicintMaxNum
{
get
{
return_maxNum;
}
}
publicvoidComputePrimeNum(ThreadParamparam)
{
IntPtrhWnd=param.MainWndHandle;
AutoResetEventeventCancel=param.EventCancel;
ControlmainFrame=Control.FromHandle(hWnd);
if(OnStart!
=null&&mainFrame.IsDisposed==false)
mainFrame.BeginInvoke(OnStart);
for(inti=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(OnProgress,newobject[]{i});
}
}
if(OnFinished!
=null)
{
mainFrame.BeginInvoke(OnFinished,newobject[]{_primeNum});
}
}
}
}
类win32,thread,代码与上面相同。
4.设计一个Windows应用程序,用多线程实现一个简单的计算器,用来计算指定范围内数中素数的个数,并用bgininvoke发送消息返回素数的个数并显示进度,实现主线程和辅助线程之间的通信。
源程序如下:
Win32代码:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Runtime.InteropServices;
namespaceMultiThreadDemo
{
publicclassWin32
{
publicconstintWM_COMPUTESTART=0x0400+1;
publicconstintWM_COMPUTEFINISHED=0x0400+2;
publicconstintWM_COMPUTEPROGRESS=0x0400+3;
publicconstintWM_COMPUTECANCELED=0x0400+4;
}
}
Primes类代码:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
us
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)