经济论文发表

基金项目要保留_论文发表__期刊目录网,论文发表

发布日期:2022-10-04 浏览次数:科研问题问AI


基金项目要保留_论文发表__期刊目录网,论文发表


  基金项目要保留
  Delphi多线程编程中同步机制的分析与研究
  胡丹桂
  武汉职业技术学院计算机学院湖北武汉430074
  基金项目:
  湖北省教育厅2008年度人文社会科学研究项目重点项目编号2008d154
  项目名称:高等职业院校《Delphi程序设计》教学改革研究
  项目主持人武汉职业技术学院计算机学院何定华
  摘要:Delphi封装了一个类:TThread,使用这个类可以很方便的实现多线程编程。多线程编程可以带来很多好处,但同时也存在不少问题,线程同步就是多线程编程中一个非常关键及重要的问题。Delphi提供了多种同步对象来完成线程的同步,下面就Delphi多线程编程中如何实现同步机制来进行分析与研究。
  关键字:线程同步Synchronize临界区
  1概述
  线程本质上是进程中一段并发运行的代码。一个进程至少有一个线程,即所谓的主线程。同时还可以有多个子线程。当一个进程中用到超过一个线程时,就是所谓的“多线程”。Delphi在Classes单元中对线程作了一个较好的封装,这就是VCL的线程类:TThread。这个类基本用法是:先从TThread派生一个自己的线程类(因为TThread是一个抽象类,不能生成实例),然后是Override抽象方法:Execute(这就是线程函数,也就是在线程中执行的代码部分)。
  多线程同步工作时,如果同时调用相同的资源,就可能会出现问题,一般读出是不会有问题的,但是,如果写入(全局变量、数据库),就会发生冲突,甚至产生死锁和竞争问题。
  以加一为例:
  一般来说,对内存数据加一的操作分解以后有三个步骤:
  1、从内存中读出数据
  2、数据加一
  3、存入内存
  现在假设在一个两个线程的应用中进行加一操作可能出现的一种情况:
  1、线程A从内存中读出数据(假设为3)
  2、线程B从内存中读出数据(也是3)
  3、线程A对数据加一(现在是4)
  4、线程B对数据加一(现在也是4)
  5、线程A将数据存入内存(现在内存中的数据是4)
  6、线程B也将数据存入内存(现在内存中的数据还是4,但两个线程都对它加了1,应该是5才对,所以这里出现了错误的结果)。
  由此可见,多线程编程中研究多线程的同步机制就显得非常重要。
  2同步机制
  同步机制,实际上是事件驱动机制,意思是让线程平时处于“休眠”状态,除非发生某个事件才触发。线程的同步包括许多方面的内容,Delphi和Windows提供了许多方法,可以非常容易地实现线程的同步。
  2.1使用Synchronize方法
  在Delphi的多线程编程中,各种VCL构件都是临界资源,只能由主线程使用。其它线程要使用这些VCL构件,必须使用Synchronize方法,通过传递使用了VCL构件的方法,可避免多线程与VCL构件的冲突,避免重入问题。该过程带有唯一一个TThreadMethod类型的参数是一个不接收参数的对象方法,用于指定在线程对象中的方法。
  其方法的应用是:
  第一步:把访问主窗口(或主窗口控件资源)的代码放到线程的一个方法中;
  第二步:是在线程对象的Execute方法中,通过Synchronize方法使用该方法。
  实例:
  procedureTThreadMethodObject.Execute;
  begin
  Synchronize(update);
  end;
  procedureTThreadMethodObject.update;
  begin
  .........
  end;
  这里通过Synchronize使线程方法update同步。
  2.2使用VCL类的Lock方法
  在Delphi的IDE提供的构件中,有一些对象内部提供了线程的同步机制,工作线程可以直接使用这些控件,比如:Tfont,Tpen,TBitmap,TMetafile,Ticon等。另外,一个很重要的控件对象叫TCanvas,提供了一个Lock方法用于线程的同步,当一个线程使用此控件对象的时候,首先调用这个对象的Lock方法,然后对这个控件进行操作,完毕后再调用Unlock方法,释放对控间的控制


基金项目要保留_论文发表__期刊目录网,论文发表

AIPPT

SCI学术咨询