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;
如无特别说明,本博客文章皆为原创。转载请说明,来自吵吵博客。
原文链接:http://chaochaoblog.com/archives/40
吵吵微信朋友圈,请付款实名加入: