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 函数与.线程间的通信方法.这两个技术点.