中文字幕天天躁日日躁狠狠躁,最近中文字幕大全免费版在线,最近2019免费中文字幕视频三,亚洲精品无码你懂的,亚洲国产精品成人精品小说

  • 相關(guān)軟件
    >DELPHI下的多線程程序設(shè)計(jì)(1) 創(chuàng)建者:webmaster 更新時間:2005-07-02 01:33

    DELPHI下的多線程程序設(shè)計(jì)(1)

        我們知道,win95或winNT都是“多線程”的操作系統(tǒng),在DELPHI 2.0中,我們可以充分利用這一特性,編寫出“多線程”的應(yīng)用程序。
      對以往在DOS或16位windows下寫程序的人來說,“多線程”仍然是陌生的,但如同以前我們從DOS下的單任務(wù)過渡到windows3.1下的多任務(wù),如今我們又必須過渡到“多線程”領(lǐng)域,畢竟計(jì)算機(jī)時代是在不斷發(fā)展的。不過,幸運(yùn)的是,在DELPHI2.0下進(jìn)行多線程程序設(shè)計(jì)并不需要我們?nèi)?a target=_blank>學(xué)習(xí)龐大的WIN32API函數(shù),我們可以利用DELPHI下標(biāo)準(zhǔn)的多線程類TThread來完成我們的工作。
      TThread是一個abstract(抽象)類,也就是說,并不需要根據(jù)TThread來聲明變量(而且根據(jù)TThread聲明的變量也是完全無用),我們要做的是把TThread作為基類,用繼承的形式來生成子類。實(shí)際上,根據(jù)TThread來寫多線程應(yīng)用程序是非常容易的。
      下面就是一個基本的繼承TThread生成的多線程類。
      QuerThrd.Pas
      unitQuerThrd;
      interface
      uses
      Classes,DBTables;
      type
      TQueryThreadΚclass(TThread)
      private
      fQuery:tQuery;
      protected
      procedureExecute;override;
      public
      constructorCreate(Suspended:Boolean;Query:TQuery);
      end;
      implementation
      constructor
      TQueryThread.Create(Suspended:Boolean;Query:TQuery);
      begin
      inheritedCreate(Suspended);
      fQuery:ΚQuery;
      FreeOnTerminate:ΚTrue;
      end;
      procedureTQueryThread.Execute;
      begin
      fQuery.Open;
      end;
      end.
      在上面這個簡單的例子中,我們構(gòu)造了一個TThread的子類TQuery?Thread,用于在后臺執(zhí)行數(shù)據(jù)庫查詢。在該類的Create函數(shù)中,傳遞了兩個參數(shù)Suspended和Query,其中Suspended用于控制線程的運(yùn)行,如果Suspend為真,TQueryThread類的線程在建立后將立即被懸掛,一直到運(yùn)行了Resume方法,該線程才會繼續(xù)執(zhí)行,Query參數(shù)用于接受一個已經(jīng)存在的Query控件(在窗體中真正的Query控件)而使它在多線程的情況下運(yùn)行。Execute是最重要的過程,它是類TQueryThread的執(zhí)行部分,所有需要在這個多線程類中運(yùn)行的語句都必須寫在這個過程里。
      實(shí)際上構(gòu)造自己的多線程類時,并不需要輸入所有的這些代碼,選擇DELPHI的File菜單下的new選項(xiàng),再選“TThreadObject”項(xiàng)目,DELPHI就會為你構(gòu)造基本的程序模塊。然后我們可以根據(jù)需要再做相應(yīng)的修改。
      進(jìn)程的執(zhí)行:
      假設(shè)我們已經(jīng)建立了一個窗體FORM1,窗體中有我們將要使用的查詢控件Query1。那么我們在該單元的USES部分加入上面寫的QuerThrd單元。
      procedureTForm1.Button1Click(Sender:TObject);
      begin
     ?。⒁粋€運(yùn)行的進(jìn)程}
      TQueryThread.Create(False,Query1);
      end;
      如果這個過程被執(zhí)行,那么窗體中的查詢控件Query1就會自動在多線程的環(huán)境下運(yùn)行查詢。注意TQueryThread類中只有Create而沒有Free,動態(tài)建立類以后又忘記刪除是我們常犯的錯誤之一,不過在這里由于我們指定了FreeOnTerminate(運(yùn)行完即刪除)為真,所以當(dāng)Execute里的語句執(zhí)行完后,TQueryThread類占據(jù)的內(nèi)存控件將被自動釋放。
      然而還有一個問題值得我們注意,由于同一時刻可以有多個線程同時運(yùn)行,那么我們還必須解決好同步的問題,如果幾個多線程程序之間沒有任何關(guān)聯(lián),那么它們之間也不會有任何沖突。但實(shí)際上,可能同時運(yùn)行幾個多線程的數(shù)據(jù)庫應(yīng)用程序,由于需要共享相同的數(shù)據(jù)庫資源,我們還需要為Query1增加一個Tsession控件。
      其實(shí),雖然我們也許沒有親自使用過Session控件,但實(shí)際上,在所有的數(shù)據(jù)庫訪問時DELPHI都會自動建立一個臨時的Session控件,使用完后又動態(tài)地刪除掉它。在平常的數(shù)據(jù)庫編程時,用不著我們親自來操作,但在數(shù)據(jù)庫多線程執(zhí)行的情況下,為了不相互沖突,我們必須為每個數(shù)據(jù)庫訪問都定制自己的Session控件。這個步驟非常簡單,我們只需要在窗體中增加一個Session控件,然后給它的屬性“Sessionname”寫一個任意的名字,并再在Query1的“Sessionname”中寫一個相同的名字。這樣我們的數(shù)據(jù)庫程序就安全了。
      另一類需要解決同步問題的是那些對VCL資源進(jìn)行操作的程序,這類的程序非常多,好在解決的方法也非常簡單。
      我們可以看下面這樣一個程序:
      unitBncThrd;
      interface
      uses
      WinProcs,Classes,Graphics,ExtCtrls;
      type
      TBounceThreadΚclass(TThread)
      private
      FShape:TShape;
      FXSpeed:Integer;
      FYSpeed:Integer;
      procedureMoveShape;
      protected
      procedureExecute;override;
      public
      constructorCreate(Suspended:Boolean;Shape:TShape;XSpeed,YSpeed:Integer);
      propertyShape:TShapereadFShape;
      end;
      implementation
      procedureTBouad.MoveShape;
      var
      MaxHeight,MaxWidth:Integer;
      begin
      withFShapedo
      begin
      Left:ΚLeft+FXSpeed;
      Top:ΚTop+FYSpeed;
      if(LeftΙ0)or
      (Left+WidthΛParent.Width)then
      FXSpeed:ΚFXSpeed*-1;
      if(TopΙ0)or
     ?。═op+HeightΛPar?ent.Height)then
      FYSpeed:ΚFYSpeed*-1;


    相關(guān)文章
    本頁查看次數(shù):