如何区分线程?(50分)

  • 主题发起人 主题发起人 AI_Player
  • 开始时间 开始时间
A

AI_Player

Unregistered / Unconfirmed
GUEST, unregistred user!
就是在线程中如何知道自己是第几号线程.
 
这个问题很简单,可以在建立线程的时候传递一个参数。
即在重载Create构析方法的时候添加一个参数。
如下:
TMyThread = class
private
public
constructor Create(ID: Integer);
end;
.
.
.
constructor TMyThread.Create(ID: Integer);
begin
// 这里线程就能得到自己的序号了。
end;

Form里就可以这样写:
MyThread := TMyThread.Create(1);
 
可是,怎样在execute中得到这个参数呢?我岑经用一个全局变量来保存id的值,结果发现所有的线程的id都是同一个值
代码如下:
TMyThread = class
private
i:integer;
protected
procedure Execute;override;
public
constructor Create(ID: Integer);
end;
.
.
.
constructor TMyThread.Create(ID: Integer);
begin
i:=id;
end;
procedure Execute;override;
begin
//在这里调用i得到id
end;
 
使用线程局部存储,比如创建一个私有的ID属性,然后如上面在创建时把一个数传过来给他。
你的全局变量可做计数用,但所有的线程可以访问,所以不能作某个线程的ID,明白否?
或者用 threadvar 来在线程内声明这个ID,可以起到同私有属性一样的效果。
总之,要保证全局变量的互斥访问。OK
 
举个例子嘛,谢了!
 
就如同你上面的写法,把I做为这个THREAD的ID就应该可以了啊。
那个i:=id,后应改变ID的值,如inc(id),以用来给下一个创建的线程初始化ID.
 
向我那样似乎每个线程共用一个i
 
错! 是每个线程一个I, 这个I由全局变量ID赋值!id每赋一次值都得变一次。
 
那看来我的程序不止是id错了
 
后退
顶部