1. 程式人生 > >Delphi TThread 和 CreateThread 簡單區別

Delphi TThread 和 CreateThread 簡單區別

(KK_DDj 原創)

一、寫程式碼的時候碰到一個執行緒記憶體洩漏的問題:
描述:
建立執行緒: Delphi 自帶的 TThread 類
強制結束: TerminateThread
結果 : 會造成記憶體洩漏。

建立執行緒 : CreateThread
強制結束:TerminateThread
結果 : 不會造成記憶體洩漏。

二、若有CreateThread 的執行緒函式裡面有需要動態分配記憶體的情況,則需要將 需要動態分配和釋放記憶體放線上程函式外面,不能放在函式裡面。若放在裡面,執行緒函式自動結束時會造成記憶體洩漏,但是使用TerminateThread強制結束又沒有記憶體洩漏。(這是一個很奇怪的現象,大家可以參照一下。可能我自己做的有不對的,也可以告訴我,一起學習的哈)

三、簡述一下其中兩個函式的使用方式

CreateThread(nil, 0, @執行緒函式名, nil(執行緒函式的引數,我這裡無參就用的nil,若需要引數,網上有例子,大家可以看一下), 0, id(TerminateThread強制結束時需要用到));
注:使用CreateThread,一定要使用CloseHandle;

TerminateThread(id, 0(超時,我一般就設定立即結束為0));

簡單放置一段程式碼哈,裡面有些小細節我會在後面註釋的

type
  TForm1 = class(TForm)
  end;
  procedure IPNetPrinter;stdcall; //此宣告要放在implementation之前,類宣告的end之後,且必須加上stdcall
var
  Form1: TForm1;
  Buf : Pointer;
implementation
procedure IPNetPrinter;
begin
   //需要線上程裡面執行的程式碼
   //使用到了Buf
   IsOneFinished  := True;//我自己設定的執行緒結束標記,是全域性變數,具體看需求
end;

procedure TForm1.SearOne;
var
  TimeOut : Cardinal;
  id      : Cardinal;
  ThHand  : THandle;
begin
  try
    //用 createthread 來建立執行緒並且
    TimeOut := GetTickCount;
    GetMem(Buf, 8192); //這樣分配,線上程自動結束時才不會記憶體洩漏
    ThHand := CreateThread(nil, 0, @IPNetPrinter, nil, 0, id);
    CloseHandle(ThHand);
    //上兩句可以合併為CloseHandle(CreateThread(nil, 0, @IPNetPrinter, nil, 0, id));
    while True do
    begin
      Sleep(10);
      if (GetTickCount - TimeOut) > 90 * 1000 then
      begin
        TerminateThread(id, 0);
        Break;
      end;
      Application.ProcessMessages;
      if IsOneFinished then
      begin
        Break;
        //執行緒自己結束
      end;
  finally
    FreeMem(Buf);
  end;
    end;