麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Delphi > 正文

DELPHI下的多線程程序設計(1)

2019-11-18 18:44:36
字體:
來源:轉載
供稿:網友
DELPHI下的多線程程序設計(1)

    我們知道,win95或winNT都是“多線程”的操作系統,在DELPHI 2.0中,我們可以充分利用這一特性,編寫出“多線程”的應用程序。
  對以往在DOS或16位windows下寫程序的人來說,“多線程”仍然是陌生的,但如同以前我們從DOS下的單任務過渡到windows3.1下的多任務,如今我們又必須過渡到“多線程”領域,畢竟計算機時代是在不斷發展的。不過,幸運的是,在DELPHI2.0下進行多線程程序設計并不需要我們去學習龐大的WIN32API函數,我們可以利用DELPHI下標準的多線程類TThread來完成我們的工作。
  TThread是一個abstract(抽象)類,也就是說,并不需要根據TThread來聲明變量(而且根據TThread聲明的變量也是完全無用),我們要做的是把TThread作為基類,用繼承的形式來生成子類。實際上,根據TThread來寫多線程應用程序是非常容易的。
  下面就是一個基本的繼承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.
  在上面這個簡單的例子中,我們構造了一個TThread的子類TQueryThread,用于在后臺執行數據庫查詢。在該類的Create函數中,傳遞了兩個參數Suspended和Query,其中Suspended用于控制線程的運行,如果Suspend為真,TQueryThread類的線程在建立后將立即被懸掛,一直到運行了Resume方法,該線程才會繼續執行,Query參數用于接受一個已經存在的Query控件(在窗體中真正的Query控件)而使它在多線程的情況下運行。Execute是最重要的過程,它是類TQueryThread的執行部分,所有需要在這個多線程類中運行的語句都必須寫在這個過程里。
  實際上構造自己的多線程類時,并不需要輸入所有的這些代碼,選擇DELPHI的File菜單下的new選項,再選“TThreadObject”項目,DELPHI就會為你構造基本的程序模塊。然后我們可以根據需要再做相應的修改。
  進程的執行:
  假設我們已經建立了一個窗體FORM1,窗體中有我們將要使用的查詢控件Query1。那么我們在該單元的USES部分加入上面寫的QuerThrd單元。
  procedureTForm1.Button1Click(Sender:TObject);
  begin
  {建立一個運行的進程}
  TQueryThread.Create(False,Query1);
  end;
  如果這個過程被執行,那么窗體中的查詢控件Query1就會自動在多線程的環境下運行查詢。注意TQueryThread類中只有Create而沒有Free,動態建立類以后又忘記刪除是我們常犯的錯誤之一,不過在這里由于我們指定了FreeOnTerminate(運行完即刪除)為真,所以當Execute里的語句執行完后,TQueryThread類占據的內存控件將被自動釋放。
  然而還有一個問題值得我們注意,由于同一時刻可以有多個線程同時運行,那么我們還必須解決好同步的問題,如果幾個多線程程序之間沒有任何關聯,那么它們之間也不會有任何沖突。但實際上,可能同時運行幾個多線程的數據庫應用程序,由于需要共享相同的數據庫資源,我們還需要為Query1增加一個Tsession控件。
  其實,雖然我們也許沒有親自使用過Session控件,但實際上,在所有的數據庫訪問時DELPHI都會自動建立一個臨時的Session控件,使用完后又動態地刪除掉它。在平常的數據庫編程時,用不著我們親自來操作,但在數據庫多線程執行的情況下,為了不相互沖突,我們必須為每個數據庫訪問都定制自己的Session控件。這個步驟非常簡單,我們只需要在窗體中增加一個Session控件,然后給它的屬性“Sessionname”寫一個任意的名字,并再在Query1的“Sessionname”中寫一個相同的名字。這樣我們的數據庫程序就安全了。
  另一類需要解決同步問題的是那些對VCL資源進行操作的程序,這類的程序非常多,好在解決的方法也非常簡單。
  我們可以看下面這樣一個程序:
  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
  (Top+HeightΛParent.Height)then
  FYSpeed:ΚFYSpeed*-1;



上一篇:DELPHI下的多線程程序設計(2)

下一篇:設計模式、用Delphi實現---->Strategy模式

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 成人在线国产 | 免费一区二区三区 | 国产三级在线视频观看 | 成人午夜免费观看 | 色蜜桃av| 亚洲视频观看 | 一级国产免费 | 色婷婷久久一区二区 | www噜噜偷拍在线视频 | 日日天日日夜日日摸 | 欧美极品欧美精品欧美视频 | 精品国产一区二区三区久久久蜜月 | 色就色 综合偷拍区91网 | 亚洲成人精品区 | 日韩精品久久久久久 | 日韩精品中文字幕一区二区 | 欧美一级成人一区二区三区 | 吾色视频 | 久久精品在线免费观看 | 美国黄色小视频 | 亚州综合图片 | 久久蜜桃香蕉精品一区二区三区 | 性少妇videosexfreexx | 免费一级在线 | 麻豆视频观看 | 在线观看av国产一区二区 | 精品一区二区三区免费视频 | 欧美在线观看视频一区二区 | 免费观看一级黄色片 | 亚洲成人夜色 | 250pp久久新| 久久精品在线免费观看 | 久久99国产精品免费网站 | 第四色成人网 | 欧美国产第一页 | 国产成人免费精品 | 亚洲电影免费观看国语版 | 亚洲午夜1000理论片aa | 国产porn在线 | 日韩 综合 | 国产精品久久久麻豆 |