欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    进程与线程精选PPT.ppt

    • 资源ID:43667240       资源大小:2.62MB        全文页数:52页
    • 资源格式: PPT        下载积分:18金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要18金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    进程与线程精选PPT.ppt

    进程与线程进程与线程第1页,此课件共52页哦本章重点本章重点本章教学目的本章教学目的 通过对进程、线程基本知识以及通过对进程、线程基本知识以及BackGroundWorkBackGroundWork组件的介绍,组件的介绍,使学生对相关内容有一个感性认识。使学生对相关内容有一个感性认识。本章教学要求本章教学要求(1 1)掌握进程查看、启动、停止的基本方法;)掌握进程查看、启动、停止的基本方法;(2 2)掌握线程创建、启动、终止的基本方法;)掌握线程创建、启动、终止的基本方法;(3 3)掌握开辟多线程的基本方法;)掌握开辟多线程的基本方法;(4 4)掌握在一个线程中引用其他线程中的控件的方法;)掌握在一个线程中引用其他线程中的控件的方法;(5 5)了解其他内容。)了解其他内容。第2页,此课件共52页哦2.1 2.1 进程与线程的基本概念进程与线程的基本概念进程进程 正在执行的程序称为进程。正在执行的程序称为进程。与进程相关的信息包括:进程标示(进程与进程相关的信息包括:进程标示(进程IDID)、文件名、执行的程序)、文件名、执行的程序和数据,运行时间、在存储器中的位置、占用的内存容量等。和数据,运行时间、在存储器中的位置、占用的内存容量等。线程线程 将一个进程划分为若干个独立的执行流,每一个执行流均称为一个线程。将一个进程划分为若干个独立的执行流,每一个执行流均称为一个线程。(1 1)线程是)线程是CPUCPU调度和分配的基本单位。调度和分配的基本单位。(2 2)每个进程都有一个主线程。)每个进程都有一个主线程。(3 3)除了主线程以外,还可以给一个进程分配若干个子线程,从而)除了主线程以外,还可以给一个进程分配若干个子线程,从而达到多个任务并行执行的目的。达到多个任务并行执行的目的。第3页,此课件共52页哦2.2 2.2 进程管理(进程管理(ProcessProcess类)类)1 1、ProcessProcess类位于类位于System.DiagnosticsSystem.Diagnostics命名空间下。命名空间下。2 2、对本机(也叫本地计算机)、对本机(也叫本地计算机)(1 1)可以启动、终止某个进程)可以启动、终止某个进程 (2 2)可以查看进程相关信息,如)可以查看进程相关信息,如CPUCPU利用率等利用率等 (3 3)可以查看进程工作状态)可以查看进程工作状态3 3、对远程计算机、对远程计算机 (1 1)可以查看远程计算机相关信息)可以查看远程计算机相关信息 (2 2)无法直接启动、终止远程计算机)无法直接启动、终止远程计算机4 4、在一个程序中处理其他的程序(例如调用其他、在一个程序中处理其他的程序(例如调用其他.exe.exe文件、文件、快捷方式等),实际上就是对进程进行管理。快捷方式等),实际上就是对进程进行管理。第4页,此课件共52页哦2.2 2.2 进程管理(进程管理(ProcessProcess类)类)ProcessProcess类提供的静态方法类提供的静态方法第5页,此课件共52页哦2.2 2.2 进程管理(进程管理(ProcessProcess类)类)5 5、ProcessProcess类常用的属性和方法类常用的属性和方法-获取进程实例获取进程实例-uGetProcessByIdGetProcessById方法(静态方法):通过进程方法(静态方法):通过进程IdId创建新创建新的的ProcessProcess组件,并将其与本地计算机上的进程资源关联。组件,并将其与本地计算机上的进程资源关联。GetProcessByIdGetProcessById最多只有一个最多只有一个ProcessProcess实例。实例。uGetProcessesGetProcesses方法(静态方法):获取本机所有进程方法(静态方法):获取本机所有进程uGetProcessesByNameGetProcessesByName方法(静态方法):获取本机上方法(静态方法):获取本机上特定名称的进程特定名称的进程-获取及设置优先级获取及设置优先级-uBasePriorityBasePriority属性属性:获取进程优先级(只读)获取进程优先级(只读)uPriorityClassPriorityClass 属性:设置或更改进程优先级属性:设置或更改进程优先级第6页,此课件共52页哦2.2 2.2 进程管理(进程管理(ProcessProcess类)类)-进程进程IDID及进程名及进程名-uIdId属性:获取关联进程的属性:获取关联进程的唯一标识符唯一标识符uProcessNameProcessName属性:获取该进程的名称,不包括路径和扩展名属性:获取该进程的名称,不包括路径和扩展名-进程其他信息进程其他信息-uMachineNameMachineName属性:获取关联进程正在其上运行的计算机名称属性:获取关联进程正在其上运行的计算机名称uMainModuleMainModule属性:获取关联进程的主模块属性:获取关联进程的主模块uModulesModules属性:获取由关联进程加载的模块属性:获取由关联进程加载的模块uTotalProcessorTimeTotalProcessorTime属性:获取进程的总的处理器时间属性:获取进程的总的处理器时间uStartTimeStartTime属性:获取关联进程的启动时间属性:获取关联进程的启动时间uWorkingSet64WorkingSet64属性:为进程分配的物理内存量(字节数)属性:为进程分配的物理内存量(字节数)第7页,此课件共52页哦1.2 Process1.2 Process类类-进程启动进程启动-uStartStart方法:启动进程资源并将其与方法:启动进程资源并将其与ProcessProcess组件关联组件关联uStartInfoStartInfo属性:获取或设置要传递给启动进程的文件名以属性:获取或设置要传递给启动进程的文件名以及启动参数及启动参数-进程终止进程终止-uKillKill方法:强制终止进程方法:强制终止进程uCloseMainWindowCloseMainWindow方法:关闭具有用户界面的进程方法:关闭具有用户界面的进程uCloseClose方法:释放与此组件关联的所有资源方法:释放与此组件关联的所有资源uHasExitedHasExited属性:指示关联进程是否已终止属性:指示关联进程是否已终止uWaitForExitWaitForExit方法:设置等待关联进程退出的时间,并在该段时方法:设置等待关联进程退出的时间,并在该段时间结束前或该进程退出前,阻止当前线程执行。间结束前或该进程退出前,阻止当前线程执行。第8页,此课件共52页哦2.2.1 2.2.1 获获取取进进程信息程信息1 1、如何获取进程信息、如何获取进程信息(1 1)获取本地计算机的所有进程:)获取本地计算机的所有进程:Process myProcesses=Process.GetProcesses();Process myProcesses=Process.GetProcesses();(2 2)获取本地计算机上指定名称的进程:)获取本地计算机上指定名称的进程:Process myProcesses=Process myProcesses=Process.GetProcessesByName(Process.GetProcessesByName(进程名称进程名称););注意:(注意:(a a)进程名称不带扩展名。)进程名称不带扩展名。(b b)可以是任何一个可执行文件)可以是任何一个可执行文件例如:例如:Process myProcesses=Process myProcesses=Process.GetProcessesByName(Process.GetProcessesByName(“WindowApplication1);WindowApplication1);第9页,此课件共52页哦2.2.1 2.2.1 获获取取进进程信息程信息(续)(续)(3 3)获取远程计算机的所有进程:)获取远程计算机的所有进程:Process myProcesses=Process myProcesses=Process.GetProcesses(remoteMachineName);Process.GetProcesses(remoteMachineName);例如:例如:Process myProcesses=Process myProcesses=Process.GetProcesses(192.168.0.1);Process.GetProcesses(192.168.0.1);(4 4)获取远程计算机上指定名称的进程:)获取远程计算机上指定名称的进程:Process myProcesses=Process myProcesses=Process.GetProcessesByName(Process.GetProcessesByName(远程进程名称远程进程名称,remoteMachineName);,remoteMachineName);第10页,此课件共52页哦程序举例程序举例【例例2-12-1】【例例2-12-1】观察本机运行的所有进程,并显示进程相关的信观察本机运行的所有进程,并显示进程相关的信息。息。要求:要求:(1 1)用)用DataGridViewDataGridView显示所有进程信息显示所有进程信息 (2 2)鼠标单击)鼠标单击DataGridViewDataGridView某处时,判断单击的是否为某处时,判断单击的是否为行开头或者某个单元格,如果是,显示该行进程的详细信行开头或者某个单元格,如果是,显示该行进程的详细信息息 (运行效果见下页图)(运行效果见下页图)第11页,此课件共52页哦1.2.1 1.2.1 获获取取进进程信息程信息(续)(续)运行效果(运行效果(ProcessMonitorProcessMonitor):):第12页,此课件共52页哦2.2.2 2.2.2 启动和停止进程启动和停止进程1.1.启动进程:启动进程:方法方法1 1:(1 1)创建一个)创建一个ProcessProcess组件的实例,例如:组件的实例,例如:Process myProcess=new Process();Process myProcess=new Process();(2 2)设置其对应的)设置其对应的StartInfoStartInfo属性,指定要运行的应用程序名以及传递的参数:属性,指定要运行的应用程序名以及传递的参数:myProcess.StartInfo.FileName=myProcess.StartInfo.FileName=文件名文件名;process1.StartInfo.Arguments=process1.StartInfo.Arguments=参数参数;如果该进程带有图形用户界面,也可以指定图形用户界面的打开方式。例如:如果该进程带有图形用户界面,也可以指定图形用户界面的打开方式。例如:myProcess.StartInfo.WindowStyle=ProcessWindowStyle.Normal;myProcess.StartInfo.WindowStyle=ProcessWindowStyle.Normal;(3 3)调用该实例的)调用该实例的StartStart方法启动该进程。方法启动该进程。方法方法2 2:直接调用直接调用ProcessProcess类提供的静态方法启动进程。类提供的静态方法启动进程。第13页,此课件共52页哦2.2.2 2.2.2 启动和停止进程(续)启动和停止进程(续)2.2.停止进程停止进程 通过两种方法利用通过两种方法利用ProcessProcess组件停止进程。组件停止进程。(1 1)如果进程有图形用户界面,调用)如果进程有图形用户界面,调用CloseMainWindowCloseMainWindow方方法。法。(2 2)如果进程没有用户界面,调用进程的)如果进程没有用户界面,调用进程的KillKill方法。方法。不论有没有图形用户界面,如果希望强行让其退出,在权不论有没有图形用户界面,如果希望强行让其退出,在权限允许的情况下,均可以调用限允许的情况下,均可以调用KillKill方法终止该进程。方法终止该进程。第14页,此课件共52页哦程序举例程序举例【例例2-22-2】【例例2-22-2】启动、停止和观察启动、停止和观察NotepadNotepad进程。进程。(StartStopProcessStartStopProcess)要求:)要求:(1 1)用)用ListViewListView显示显示“记事本记事本”进程信息。进程信息。(2 2)用)用ProcessProcess类提供的静态方法启动进程。类提供的静态方法启动进程。(3 3)终止进程时,把所有)终止进程时,把所有“记事本记事本”进程全部终止。进程全部终止。第15页,此课件共52页哦项目中的应用:在程序中执行项目中的应用:在程序中执行sqlsql文件文件说明:说明:osql.exeosql.exe是是SQL ServerSQL Server提供的一个工具,可以利用该工具添加、删提供的一个工具,可以利用该工具添加、删除数据库用户,修改用户登录密码,附加、分离数据库等。对于通过程序除数据库用户,修改用户登录密码,附加、分离数据库等。对于通过程序管理数据库很有用。管理数据库很有用。public void ExecuteSqlFile(string strFileName)public void ExecuteSqlFile(string strFileName)Process SqlProcess=new Process();Process SqlProcess=new Process();SqlProcess.StartInfo.FileName=SqlProcess.StartInfo.FileName=osql.exeosql.exe;SqlProcess.StartInfo.Arguments=SqlProcess.StartInfo.Arguments=-U-U sasa -P-P sa123sa123 -d -d mydbmydb -i-i+strFileName;strFileName;SqlProcess.StartInfo.WindowStyle=SqlProcess.StartInfo.WindowStyle=ProcessWindowStyle.Hidden;ProcessWindowStyle.Hidden;SqlProcess.Start();SqlProcess.Start();SqlProcess.WaitForExit();SqlProcess.WaitForExit();SqlProcess.Close();SqlProcess.Close();第16页,此课件共52页哦2.3 2.3 线程管理(线程管理(ThreadThread类)类)2.3.1 2.3.1 前台线程与后台线程前台线程与后台线程2.3.2 2.3.2 线程基本操作线程基本操作2.3.3 Volatile2.3.3 Volatile关键字关键字2.3.4 2.3.4 在一个线程中操作另一个线程的控件在一个线程中操作另一个线程的控件第17页,此课件共52页哦2.3 2.3 线程管理(线程管理(ThreadThread类)类)ThreadThread类位于类位于System.ThreadingSystem.Threading命名空间下。命名空间下。ThreadThread类是用于创建和控制线程的类是用于创建和控制线程的,对线程的常用操作有:对线程的常用操作有:启动线程、终止线程、合并线程和让线程休眠等。启动线程、终止线程、合并线程和让线程休眠等。ThreadThread类提供的常用属性类提供的常用属性1.1.IsAliveIsAlive属性属性:获取一个值,该值指示当前线程的执行状:获取一个值,该值指示当前线程的执行状态。如果此线程已启动并且尚未正常终止,则为态。如果此线程已启动并且尚未正常终止,则为truetrue;否则为否则为falsefalse2.2.IsBackgroundIsBackground属性:属性:获取或设置一个值,该值指示某获取或设置一个值,该值指示某个线程是否为后台线程。是后台线程或即将成为后台线个线程是否为后台线程。是后台线程或即将成为后台线程,则为程,则为truetrue;否则为;否则为falsefalse3.3.PriorityPriority属性:属性:获取或设置一个值,该值指示线程的调度获取或设置一个值,该值指示线程的调度优先级优先级第18页,此课件共52页哦2.3 2.3 线程管理(线程管理(ThreadThread类)(续)类)(续)ThreadThread类提供的常用方法类提供的常用方法1.1.StartStart方法方法:启动线程:启动线程2.2.JoinJoin方法:方法:将指定的线程合并到当前线程中,并阻止当前将指定的线程合并到当前线程中,并阻止当前线程执行,直到指定的线程终止或经过了指定的时间为止线程执行,直到指定的线程终止或经过了指定的时间为止3.3.SleepSleep方法:方法:将当前线程阻止指定的毫秒数,零将当前线程阻止指定的毫秒数,零(0)(0)表示应表示应挂起此线程以使其他等待线程能够执行挂起此线程以使其他等待线程能够执行4.4.AbortAbort方法:方法:在调用此方法的线程上引发在调用此方法的线程上引发ThreadAbortExceptionThreadAbortException,以开始终止此线程的过程。调,以开始终止此线程的过程。调用此方法通常会终止线程用此方法通常会终止线程第19页,此课件共52页哦2.3.1 2.3.1 前台线程与后台线程前台线程与后台线程1.1.一个线程要么是后台线程要么是前台线程。一个线程要么是后台线程要么是前台线程。2.2.后台线程与前台线程类似,区别是后台线程不会影响进后台线程与前台线程类似,区别是后台线程不会影响进程终止。属于某个进程的所有前台线程都终止后,公共程终止。属于某个进程的所有前台线程都终止后,公共语言运行库就会结束该进程,而且所有属于该进程的后语言运行库就会结束该进程,而且所有属于该进程的后台线程也都会立即停止,而不管后台工作是否完成。台线程也都会立即停止,而不管后台工作是否完成。3.3.利用利用ThreadThread对象的对象的IsBackgroundIsBackground属性,可以设置或判属性,可以设置或判断一个线程是后台线程还是前台线程。断一个线程是后台线程还是前台线程。4.4.通过将某个线程的通过将某个线程的IsBackgroundIsBackground属性设置为属性设置为truetrue,使其,使其变为后台线程。变为后台线程。5.5.默认情况下,属于托管线程池的线程(即其默认情况下,属于托管线程池的线程(即其IsThreadPoolThreadIsThreadPoolThread属性为属性为truetrue的线程)都是后台线程,的线程)都是后台线程,通过创建并启动新的通过创建并启动新的ThreadThread对象而生成的线程都是前台对象而生成的线程都是前台线程。线程。第20页,此课件共52页哦2.3.2 2.3.2 线程的基本操作线程的基本操作1.1.启动线程启动线程启动线程前,首先要创建一个线程。启动线程前,首先要创建一个线程。u创建无参数线程的一般形式为:创建无参数线程的一般形式为:Thread t1=new Thread(Thread t1=new Thread(线程名线程名););创建带参数线程的一般形式为(传递一个创建带参数线程的一般形式为(传递一个ObjectObject类型的参数):类型的参数):Thread t2=new Thread(Thread t2=new Thread(线程名线程名(Object obj);(Object obj);对于不止一个参数的情况,可以先将这些参数封装到一个类中,然后传递该类的实例,对于不止一个参数的情况,可以先将这些参数封装到一个类中,然后传递该类的实例,在线程中,再通过该实例访问相应的数据,从而达到启动线程时传递多个参数的目的。在线程中,再通过该实例访问相应的数据,从而达到启动线程时传递多个参数的目的。创建线程实例后,就可以调用创建线程实例后,就可以调用StartStart方法启动线程了。例如:方法启动线程了。例如:t1.Start();/t1.Start();/不带参数不带参数 t2.Start(t2.Start(“myClassmyClass”);/);/带参数带参数注意:注意:调用调用StartStart只是告诉系统启动该线程,但是系统并不一定会立即启动它。只是告诉系统启动该线程,但是系统并不一定会立即启动它。第21页,此课件共52页哦2.3.2 2.3.2 线程的基本操作线程的基本操作2.2.终止线程终止线程 两种方法:两种方法:1.1.事先设置一个布尔字段,在其他线程中通过修改该布尔量事先设置一个布尔字段,在其他线程中通过修改该布尔量的值作为传递给该线程是否需要终止的判断条件,而在该的值作为传递给该线程是否需要终止的判断条件,而在该线程中循环判断该布尔值,以确定是否退出线程,这是结线程中循环判断该布尔值,以确定是否退出线程,这是结束线程比较好的方法,实际应用中一般使用这种方法。束线程比较好的方法,实际应用中一般使用这种方法。2.2.调用调用ThreadThread类的类的AbortAbort方法,该方法的最终效果是强行终方法,该方法的最终效果是强行终止线程。止线程。第22页,此课件共52页哦2.3.2 2.3.2 线程的基本操作线程的基本操作3.3.暂停线程暂停线程在多线程应用程序中,有时候并不希望某一个线程继续执在多线程应用程序中,有时候并不希望某一个线程继续执行,而是希望该线程暂停一段时间,这样,行,而是希望该线程暂停一段时间,这样,CPUCPU就会将其就会将其时间片中剩余的部分让给另一个线程。时间片中剩余的部分让给另一个线程。调用调用ThreadThread类的类的SleepSleep方法可以实现这个功能。例如:方法可以实现这个功能。例如:Thread.Sleep(1000);Thread.Sleep(1000);这条语句的功能是让当前线程暂停这条语句的功能是让当前线程暂停10001000毫秒。毫秒。注意注意 SleepSleep方法是静态方法,暂停的是该语句所在的线程,而不方法是静态方法,暂停的是该语句所在的线程,而不是其他线程。是其他线程。第23页,此课件共52页哦2.3.2 2.3.2 线程的基本操作线程的基本操作4.4.合并线程合并线程JoinJoin方法用于把指定的线程合并到当前线程中,从而使其变方法用于把指定的线程合并到当前线程中,从而使其变为一个单个的线程。为一个单个的线程。如果一个线程如果一个线程t1t1在执行的过程中需要等待另一个线程在执行的过程中需要等待另一个线程t2t2结束结束后才能继续执行,可以在后才能继续执行,可以在t1t1的代码块中调用的代码块中调用t2t2的的joinjoin方法。方法。例如:例如:t2.Join();t2.Join();功能:功能:t1t1在执行到在执行到t2.Join()t2.Join()语句后,就处于暂停状态,直到语句后,就处于暂停状态,直到t2t2结束后才会继续执行。结束后才会继续执行。为了避免为了避免t1t1一直等待,可以在调用一直等待,可以在调用t2t2的的JoinJoin方法的时候指定方法的时候指定一个暂停时间,例如:一个暂停时间,例如:t2.Join(100);t2.Join(100);第24页,此课件共52页哦2.3.3 Volatile2.3.3 Volatile关键字关键字volatilevolatile修饰符表示所声明的字段可以被多个并发执行的线程修改。修饰符表示所声明的字段可以被多个并发执行的线程修改。如如果某个字段声明包含果某个字段声明包含volatilevolatile关键字,则该字段将不再被编译器关键字,则该字段将不再被编译器优化。这样可以确保该字段在任何时间呈现的都是最新的值。优化。这样可以确保该字段在任何时间呈现的都是最新的值。对于由多个线程访问的字段,而且该字段没有用对于由多个线程访问的字段,而且该字段没有用locklock语句对访问语句对访问进行序列化,声明字段时应该使用进行序列化,声明字段时应该使用volatilevolatile修饰符。修饰符。volatilevolatile修饰符只能包含在类或结构的字段声明中修饰符只能包含在类或结构的字段声明中,不能将局部变量不能将局部变量声明为声明为volatilevolatile。在布尔型字段的声明中,添加在布尔型字段的声明中,添加volatilevolatile修饰符的方法如下:修饰符的方法如下:public volatile bool shouldStop;public volatile bool shouldStop;第25页,此课件共52页哦2.3.3 Volatile2.3.3 Volatile关键字关键字volatilevolatile修饰符可应用于以下类型修饰符可应用于以下类型:(1 1)引用类型。)引用类型。(2 2)指针类型(在不安全的上下文中)。)指针类型(在不安全的上下文中)。(3 3)整型,如)整型,如sbytesbyte、bytebyte、shortshort、ushortushort、intint、uintuint、charchar、floatfloat和和boolbool。(4 4)具有整数基类型的枚举类型。)具有整数基类型的枚举类型。(5 5)已知为引用类型的泛型类型参数。)已知为引用类型的泛型类型参数。(6 6)IntPtrIntPtr和和UIntPtrUIntPtr。第26页,此课件共52页哦2.3.4 2.3.4 在一个线程中操作另一个线程的控件在一个线程中操作另一个线程的控件默认情况下,在默认情况下,在WindowsWindows应用程序中,应用程序中,.NET Framework.NET Framework不不允许在一个线程中直接操作另一个线程中的控件,这是因允许在一个线程中直接操作另一个线程中的控件,这是因为访问为访问WindowsWindows窗体控件本质上不是线程安全的。窗体控件本质上不是线程安全的。在应用程序中,如果创建某控件的线程之外的其他线程试在应用程序中,如果创建某控件的线程之外的其他线程试图调用该控件,则系统会引发一个图调用该控件,则系统会引发一个InvalidOperationExceptionInvalidOperationException异常。异常。有两种办法可以解决这个问题:有两种办法可以解决这个问题:(1 1)使用委托()使用委托(delegatedelegate)操作另一个线程中的控件)操作另一个线程中的控件 (2 2)用)用BackgroundWorkerBackgroundWorker组件在后台执行线程组件在后台执行线程第27页,此课件共52页哦2.3.4 2.3.4 在一个线程中操作另一个线程的控件(续)在一个线程中操作另一个线程的控件(续)利用委托调用另一个线程控件(方法利用委托调用另一个线程控件(方法1 1,不易理解):,不易理解):delegate void AppendStringDelegate(string str);delegate void AppendStringDelegate(string str);private void AppendString(string str)private void AppendString(string str)if(richTextBox1.InvokeRequired)if(richTextBox1.InvokeRequired)AppendStringDelegate d=AppendString;AppendStringDelegate d=AppendString;richTextBox1.Invoke(d,str);richTextBox1.Invoke(d,str);else else richTextBox1.Text+=str;richTextBox1.Text+=str;第28页,此课件共52页哦2.3.4 2.3.4 在一个线程中操作另一个线程的控件在一个线程中操作另一个线程的控件利用委托调用另一个线程控件(方法利用委托调用另一个线程控件(方法2 2,容易理解):,容易理解):private delegate void AppendStringDelegate(string str);private delegate void AppendStringDelegate(string str);public void AppendString(string str)public void AppendString(string str)richTextBox1.BeginInvoke(richTextBox1.BeginInvoke(new AppendStringDelegate(AddMessageToRichTextBox),new AppendStringDelegate(AddMessageToRichTextBox),new Objectmessage);new Objectmessage);private void AddMessageToRichTextBox(string message)private void AddMessageToRichTextBox(string message)richTextBox1.AppendText(message);richTextBox1.AppendText(message);第29页,此课件共52页哦程序举例程序举例【例例2-32-3】【例例2-32-3】在在Class1Class1类中声明两个方法类中声明两个方法Method1Method1和和Method2Method2,其中,其中Method1Method1不停地输出字符不停地输出字符“a a”,Method2Method2不停地输不停地输出字符出字符“b b”,在,在Form1Form1中启动线程执行中启动线程执行Method1Method1和和Method2Method2,并在,并在RichTextBoxRichTextBox中显示线程输出的字符。中显示线程输出的字符。(ThreadExampleThreadExample)第30页,此课件共52页哦2.4 2.4 线程同步与线程池线程同步与线程池2.4.1 2.4.1 线程的优先级线程的优先级2.4.2 2.4.2 线程同步线程同步2.4.3 lock2.4.3 lock语句语句2.4.4 2.4.4 线程池线程池第31页,此课件共52页哦2.4.1 2.4.1 线程的优先级线程的优先级五个优先级,由高到低分别是:五个优先级,由高到低分别是:HighestHighest、AboveNormalAboveNormal、NormalNormal(默认)、(默认)、BelowNormalBelowNormal和和LowestLowest可以使用下面的方法为其赋予较高的优先级:可以使用下面的方法为其赋予较高的优先级:Thread t=new Thread(MethodName);Thread t=new Thread(MethodName);t.priority=ThreadPriority.AboveNormal;t.priority=ThreadPriority.AboveNormal;通过设置线程的优先级可以改变线程的执行顺序,所设置的优先级仅仅适用通过设置线程的优先级可以改变线程的执行顺序,所设置的优先级仅仅适用于这些线程所属的进程。于这些线程所属的进程。注意:注意:当把某线程的优先级设置为当把某线程的优先级设置为HighestHighest时,系统正在运行的其他线程都会时,系统正在运行的其他线程都会终止,所以使用这个优先级别时要特别小心。终止,所以使用这个优先级别时要特别小心。第32页,此课件共52页哦2.4.2 2.4.2 线程同步线程同步同步同步 指多个线程之间存在先后执行顺序的关联关系。指多个线程之间存在先后执行顺序的关联关系。哪些资源需要同步哪些资源需要同步u系统资源(如通信端口)系统资源(如通信端口)u多个进程所共享的资源(如文件句柄)多个进程所共享的资源(如文件句柄)u由多个线程访问的单个应用程序域的资源(如全局、静态由多个线程访问的单个应用程序域的资源(如全局、静态和实例字段)和实例字段)第33页,此课件共52页哦2.4.2 2.4.2 线程同步线程同步为什么要同步为什么要同步 当两个线程当两个线程t1t1和和t2t2有相同的优先级,并且同时在系统上运行时,有相同的优先级,并且同时在系统上运行时,如果先把时间片分给如果先把时间片分给t1t1使用,它在结构使用,它在结构s1s1中(该结构中有多个变量)中(该结构中有多个变量)写入某些值,但如果在时间片用完时它仍没有完成写入,这时由于写入某些值,但如果在时间片用完时它仍没有完成写入,这时由于时间片已经分给时间片已经分给t2t2使用,而使用,而t2t2又恰好要尝试读取该结构的值,此时读又恰好要尝试读取该结构的值,此时读出的就不是正确的值。这种情况下,如果使用同步仅允许一个线程使用出的就不是正确的值。这种情况下,如果使用同步仅允许一个线程使用s1s1,在该线程完成对,在该线程完成对s1s1的写入工作后再让的写入工作后再让t2t2读取这个结构值,就可以读取这个结构值,就可以避免出现此类错误。避免出现此类错误。第34页,此课件共52页哦2.4.2 2.4.2 线程同步线程同步解决方法解决方法:uSystem.ThreadingSystem.Threading命名空间提供了多个用于同步线程的命名空间提供了多个用于同步线程的类这些类包括类这些类包括MutexMutex、MonitorMonitor、InterlockedInterlocked和和AutoResetEventAutoResetEvent。u在实际应用中在实际应用中经常使用经常使用locklock语句语句完成线程同步。完成线程同步。该语句简化了编程的复杂性,使程序看起来既清晰又简洁该语句简化了编程的复杂性,使程序看起来既清晰又简洁第35页,此课件共52页哦2.4.3 lock2.4.3 lock语句语句locklock语句的功能语句的功能 locklock语句可以有效地实现同步,即将代码段(语句块)标记为临界区。它语句可以有效地实现同步,即将代码段(语句块)标记为临界区。它能确保当一个线程位于代码的临界区(可以理解为一段代码)时,另一个能确保当一个线程位于代码的临界区(可以理解为一段代码)时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码段,则它将一直等线程不进入临界区。如果其他线程试图进入锁定的代码段,则它将一直等待(即被阻塞),直到锁定的对象被释放以后才能进入临界区。待(即被阻塞),直到锁定的对象被释放以后才能进入临界区。locklock语句的用法语句的用法 首先利用首先利用locklock语句锁定某一个对象,然后执行代码段中的语句,等代码段语句锁定某一个对象,然后执行代码段中的语句,等代码段中的语句执行完毕后,再释放该对象。中的语句执行完毕后,再释放该对象。private Object obj=new Object();private Object obj=new Object();lock(obj)lock(obj)/临界区中的代码临界区中的代码 第36页,此课件共52页哦2.4.3 lock2

    注意事项

    本文(进程与线程精选PPT.ppt)为本站会员(石***)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开