DelphiCreateThread创建多线程的写法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;thread技术
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}
{
发送消息给消息弹出代理程序
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 函数与.线程间的通信⽅法.这两个技术点.
给线程函数传递参数是这样做的!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论