吵吵   2011-03-03  阅读:3,873

吵吵发布

delphi 使用多线程之间的参数传递能够同时完成多个任务,比如说你需要第一个线程读取第一个记录并执行相应操作,第二个线程读取第二个记录并执行相应的操作,那么你就可以同时建立多个线程,每个线程都在读取不同的记录然后执行相应的操作,这样形成的效率效果是相当显著的。

那么怎么才能判断线程进入函数后读取相应记录呢,我们可以让每个线程进函数时传递一个参数,这样根据这个参数,我们来判断要读取第几条记录,那么这个参数要怎么传递的呢,我们看createthread这个api函数:

HANDLE CreatThread(

   LPSECURITY_ATTRIBUTES lpThreadAttributes,

   DWORD dwStackSize,

   LPTHREAD_START_ROUTINE lpStartAddress,

   LPVOID lpParameter,

   DWORD dwCreationFlags,

   LPDWORD lpThreadld

   ),

  参数说明:

  pThreadAttributes 如果为NULL,该线程使用默认安全属性。如果希望所有子进程能够继承该线程对象的句柄,必须将他的bInheritHand成员初始化为True。

  dwStackSize 设定线程堆栈的地址空间。如果非0,函数将所有的存储器保留并分配给线的程堆栈。

  lpStartAddress 线程函数的地址。

  lpParameter 传递给线程函数的参数。

  dwCreationFlags 如果是0,线程创建后立即对它进行调度,如果是CREATE_SUSPENDED,系统对它进行初始化后暂停该线程的运行。

  lpThreadld 用来存放系统分配给新线程的ID。
可以看到lpParameter参数指向的是一个指针,这个指针只要指向一个参数就行了吗?比如是定义的一个i :integer,然后在循环中指向它


for i := 1 to threadnum do
begin

mythread[i]:=CreateThread(nil,0,@sendThread,@i,0,Tid);
memo2.Lines.Add('第'+inttostr(i)+'个线程创建成功');
sleep(300);
end;


实际上这样是不行的,会出现错误,在delphi中要实现多线程参数的传递必须要定义一个结构,如

type
Pthreadid = ^Tthreadid;
Tthreadid = record

threadid: Integer;
end;

吵吵发布

然后可以这样使用

for i := 1 to threadnum do
begin
new(threadid);
threadid^.threadid:=i;
mythread[i]:=CreateThread(nil,0,@sendThread,threadid,0,Tid);
memo2.Lines.Add('第'+inttostr(i)+'个线程创建成功');
sleep(300);
end;


在相应执行函数 sendThread中可以这样引用了


procedure sendThread(mythreadID:Pthreadid);stdcall;

begin

handleid:=mythreadid^.threadid;

end;


吵吵发布

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

发表评论

电子邮件地址不会被公开。 必填项已用*标注