叽哩咕噜

君子如玉,上善若水

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








posted on 2010-09-01 14:46 叽哩咕噜 阅读(9391) 评论(0)  编辑  收藏 所属分类: 个人总结


只有注册用户登录后才能发表评论。


网站导航:
 

公告

疯狂

导航

<2010年9月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

统计

常用链接

留言簿

随笔分类(17)

随笔档案(22)

文章分类(1)

文章档案(1)

工程教程

牛人BLOG

搜索

最新评论

阅读排行榜

评论排行榜