程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi多線程實例解析

Delphi多線程實例解析

編輯:Delphi

    我們都知道當前的Windows操作系統是一個“多線程”操作系統。那麼什麼是線程呢?線程就是進程中的一個實體,它和進程一樣能夠獨立的執行控制,由操作系統負責調度,其區別就在於線程沒有獨立的存儲空間,而是與同屬於一個進程的其他線程共享一個存儲空間,這使得多線程之間的通信較進程簡單,並且多線程的執行都是並發而且是相互獨立的。為了運行所有這些線程,操作系統為每個獨立線程安排一些CPU 時間,操作系統以輪轉方式向線程提供時間片,這就給人一種假象,好象這些線程都在同時運行。

  CreatThread函數是用於創建一個線程,CreatThread函數原形及參數說明如下:

  HANDLE CreatThread(

   LPSECURITY_ATTRIBUTES lpThreadAttributes,

   DWord dwStackSize,

   LPTHREAD_START_ROUTINE lpStartAddress,

   LPVOID lpParameter,

   DWord dwCreationFlags,

   LPDWord lpThreadld

   ),

  參數說明:

  pThreadAttributes 如果為NULL,該線程使用默認安全屬性。如果希望所有子進程能夠繼承該線程對象的句柄,必須將他的bInheritHand成員初始化為True。

  dwStackSize 設定線程堆棧的地址空間。如果非0,函數將所有的存儲器保留並分配給線的程堆棧。

  lpStartAddress 線程函數的地址。

  lpParameter 傳遞給線程函數的參數。

  dwCreationFlags 如果是0,線程創建後立即對它進行調度,如果是CREATE_SUSPENDED,系統對它進行初始化後暫停該線程的運行。

  lpThreadld 用來存放系統分配給新線程的ID。

  下面這段程序就介紹了我們在使用線程和沒有使用線程二種情況下,運行程序之後該程序的反應。當點擊Button1按鈕時,則建立一個線程,這時候我們可以看到在應用程序進行位圖移動的同時,可以對窗體的尺寸大小進行改變或移動窗體位置。當按下Button2按鈕時,則不建立線程,我們會發現程序在位圖沒有完全移動完之前根本不能做其它任何事情,如果我們設置位圖循環移動的話,那麼感覺這個應用程序就像死掉一樣!

  unit Unit1;

  interface

  uses

   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

   Dialogs, StdCtrls, ExtCtrls;  

  type

   TForm1 = class(TForm)

  Button1: TButton;

   Button2: TButton;

   procedure Button1Click(Sender: TObject);

   procedure Button2Click(Sender: TObject);

   private

   { Private declarations }

   public

   { Public declarations }

   end;

  var

   Form1: TForm1;   

  implementation  

  {$R *.dfm}

  function NewThread(P:pointer):Longint;stdcall;

  var

  newbmp: TBitmap;

  i,bmpheight,bmpwidth:integer;

  begin

  newbmp:= TBitmap.Create;

  newbmp.Width:=500;

  newbmp.Height:=200;

  bmpwidth:=500;

  bmpheight:=200;

  newbmp.LoadFromFile('圖片.bmp');

  for i:=0 to bmpheight do

  begin

  form1.Canvas.CopyRect(Rect(0,bmpheight-i,bmpwidth,bmpheight),newbmp.Canvas,Rect(0,0,bmpwidth,i)); //通過CopyRect方法,使位圖實現在 form1窗體上的視覺上移

  sleep(10);//停留時間

  end;

  newbmp.free;

  end;

  procedure TForm1.Button1Click(Sender: TObject);

  var

   CThread:Thandle;//聲明了一個句柄

   Tid:DWord;

  begin

   Cthread:=CreateThread(nil,0,@NewThread,nil,0,Tid); //創建一個線程,同時調用線程函數

  end;

  procedure TForm1.Button2Click(Sender: TObject);

  begin

  NewThread(nil); //沒有創建線程時,直接調用線程函數

  end;

  end.

  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved