为什么我批量产生的线程会这样?--传入的数据都变成了最后一次的那个?详情进来看看,很奇怪 ( 积分: 50 )

  • 主题发起人 主题发起人 行到水穷处
  • 开始时间 开始时间

行到水穷处

Unregistered / Unconfirmed
GUEST, unregistred user!
是这样的,我想批量产生线程,然后再批量执行。
用一个循环(For I :=0 to N 的那种)Create线程,其中线程的Create函数传入的变量和循环的次数有关系(I 是一个端口数),问题是假如我创建一个线程,并执行Execute,就会正常,而,当创建后挂起,再Resume的时候,所有的线程内的端口数据(传入的 变量I) 都成了最后的那个了(就是端口数本来是从0到N的,但是现在却都是N了)。

public
constructor Create(InputStringList:TStringList);
..........
constructor TMyThread.Create(InputStringList:TStringList);
begin
inherited Create(True);
FString:=InputStringList;
使用的时候:

var
I : integer
TempThread: TMyThread;
ThreadPoint:string;
TempThreadName:string;
begin
//启动线程 完成ThreadId(Point)的产生。
for I := 0 to 9do

begin
Msg[0]:=IntToStr(I);
TempThread := TMyThread.Create(Msg);//Msg是一个传入的变量,
ThreadPoint := IntToStr(Integer(TempThread));
TempThreadName:=ThreadPoint;
MyThreadList.AddObject( ThreadPoint, TempThread);
//MyThreadList 是一个全局变量,控制线程的。
end;

到这里完成线程创建,线程创建后是挂起的// inherited Create(True);

function TThreadManager.StartScan: boolean;
var
I: Integer;
begin
Result := False;
if MyThreadList.Count = 0 then
exit;
for I := 0 to MyThreadList.Count-1do
begin
Result := True;
TMyThread(StrToInt(MyThreadList)).Resume;//在这里统一运行线程
end;
end;
结果,发现,在线程的产程的数据出现了问题,10个线程里面的有关Msg[0] 的数据全部是 9
 
是这样的,我想批量产生线程,然后再批量执行。
用一个循环(For I :=0 to N 的那种)Create线程,其中线程的Create函数传入的变量和循环的次数有关系(I 是一个端口数),问题是假如我创建一个线程,并执行Execute,就会正常,而,当创建后挂起,再Resume的时候,所有的线程内的端口数据(传入的 变量I) 都成了最后的那个了(就是端口数本来是从0到N的,但是现在却都是N了)。

public
constructor Create(InputStringList:TStringList);
..........
constructor TMyThread.Create(InputStringList:TStringList);
begin
inherited Create(True);
FString:=InputStringList;
使用的时候:

var
I : integer
TempThread: TMyThread;
ThreadPoint:string;
TempThreadName:string;
begin
//启动线程 完成ThreadId(Point)的产生。
for I := 0 to 9do

begin
Msg[0]:=IntToStr(I);
TempThread := TMyThread.Create(Msg);//Msg是一个传入的变量,
ThreadPoint := IntToStr(Integer(TempThread));
TempThreadName:=ThreadPoint;
MyThreadList.AddObject( ThreadPoint, TempThread);
//MyThreadList 是一个全局变量,控制线程的。
end;

到这里完成线程创建,线程创建后是挂起的// inherited Create(True);

function TThreadManager.StartScan: boolean;
var
I: Integer;
begin
Result := False;
if MyThreadList.Count = 0 then
exit;
for I := 0 to MyThreadList.Count-1do
begin
Result := True;
TMyThread(StrToInt(MyThreadList)).Resume;//在这里统一运行线程
end;
end;
结果,发现,在线程的产程的数据出现了问题,10个线程里面的有关Msg[0] 的数据全部是 9
 
Resume 源码能看出来什么问题?
procedure TThread.Resume;
var
SuspendCount: Integer;
begin
SuspendCount := ResumeThread(FHandle);
CheckThreadError(SuspendCount >= 0);
if SuspendCount = 1 then
FSuspended := False;
end;
 
Msg变量要同步
 
你每次传入的Msg都是同一个对象,出现这种现象当然不奇怪。
 
xeen:
你好,怎么解决这个问题?
 
假如我创建一个线程,并执行Execute,就会正常,
 
明白了,呵呵。
在构建函数里面我没处理好接受的变量。
在Execute里面再处理传入的变量就会发生这种问题。
 
接受答案了.
 
后退
顶部