Delphi CreateThread 創建多線程的寫法


function CreateThread(lpThreadAttributes: Pointer;
                      dwStackSize: DWORD;
                      lpStartAddress: TFNThreadStartRoutine;
                      lpParameter: Pointer;
                      dwCreationFlags: DWORD;
                      var lpThreadId: DWORD): THandle; stdcall;

其中lpStartAddress,lpParameter,lpThreadId三個參數是必須的。
lpStartAddress參數指向的是線程執行體ThreadProc的開始地址;
lpParameter指針類型,線程的傳入參數,我們如果想給線程執行體ThreadProc傳遞我們自己的數據,
           就要通過它了;
lpThreadId返回創建線程ID,這是我們控制線程必須的。



主要說lpStartAddress和lpParameter這兩個參數..
lpStartAddress主開始的地址.說明這是個指針.一般傳一個方法的地址進去.. 也就是我們要執行的一段代碼.
lpParameter就是參數.我們自己要執行的方法肯定會有參數的. 一般都是傳一個Record類型的指針.

下面復制一個我的Demo例子:

unit CreateThreadFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  MyParam = record    //線程的時候傳遞
    str:string;
  end;
  PMyParam=^MyParam; //Record類型指針
   procedure CallAgent(msg: PMyParam);stdcall;  //這個方法聲明為什么要放在這里就可以,放在類TForm1里面就不行.
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);


  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{
發送消息給消息彈出代理程序   POPAgent.exe
DDZ
2010年8月28日14:44:36
}

procedure TForm1.Button1Click(Sender: TObject);
var
  PMyPara:PMyParam;
  MyPara:MyParam;
  Cthread: THandle;   //線程句柄
  Tid: DWord;
begin
  new(PMyPara) ;   //另外這里還有一個問題,這里只New開辟類型,並沒有FreeMem會不會漏了
  PMyPara.str := 'h太低發出來';
  Cthread:=CreateThread(nil,0,@CallAgent,PMyPara,0,Tid); //創建一個線程,同時調用線程函數
end;

procedure CallAgent(msg: PMyParam);stdcall;
var
  HlAgent:HWND;
  ds:TCopyDatastruct;
  AgentMsg:string;
begin
 
  //showmessage(msg^.str);
  AgentMsg := msg.str;
  //Application.ProcessMessages;
  ds.cbData := Length(AgentMsg)+1;
  GetMem(ds.lpData,ds.cbData); //分配內存
  StrCopy(ds.lpData,PChar(AgentMsg)); //復制值到指針

  HlAgent :=FindWindow('TmsgpopMainCaller','調用者');
  if  HlAgent <> 0 then
  begin
    SendMessage(HlAgent,WM_COPYDATA,0,Cardinal(@ds));
  end;
  FreeMem(ds.lpData); //釋放內存  這里要釋放, 上面的Record記錄要不要釋放 呢.我這樣寫會報錯的
end;

end.



看這個例子可以參考   CreateThread 函數與.線程間的通信方法.這兩個技術點.

轉自:http://www.blogjava.net/wangxunhua/archive/2010/09/01/330606.html

給線程函數傳遞參數是這樣做的!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM