实验报告六.docx

上传人:b****3 文档编号:26794609 上传时间:2023-06-22 格式:DOCX 页数:23 大小:45.94KB
下载 相关 举报
实验报告六.docx_第1页
第1页 / 共23页
实验报告六.docx_第2页
第2页 / 共23页
实验报告六.docx_第3页
第3页 / 共23页
实验报告六.docx_第4页
第4页 / 共23页
实验报告六.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

实验报告六.docx

《实验报告六.docx》由会员分享,可在线阅读,更多相关《实验报告六.docx(23页珍藏版)》请在冰豆网上搜索。

实验报告六.docx

实验报告六

攀枝花学院实验报告

实验课程:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1