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 函數與.線程間的通信方法.這兩個技術點.