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

cclq 2005-03-21 04:03:59
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 9 do
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-1 do
begin
Result := True;
TMyThread(StrToInt(MyThreadList[I])).Resume;//在这里统一运行线程
end;
end;
结果,发现,在线程的产程的数据出现了问题,10个线程里面的有关Msg[0] 的数据全部是 9
...全文
110 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
kp1150 2005-03-22
  • 打赏
  • 举报
回复
constructor TMyThread.Create(InputStringList:TStringList);
begin
inherited Create(True);
FString:=InputStringList;//我覺得這句話有問題!
因為你每創建一次,就會調用create,FString的值則會被覆蓋一次!所以如果for i := 0 to n的話
側FString的值只能是最後創建的線程傳遞過來的參數,肯定就會是n了!
cclq 2005-03-22
  • 打赏
  • 举报
回复
同步问题?
cclq 2005-03-22
  • 打赏
  • 举报
回复
是这样的,我想批量产生线程,然后再批量执行。
用一个循环(For I :=0 to N 的那种)Create线程,其中线程的Create函数传入的变量和循环的次数有关系(I 是一个端口数),问题是假如我创建一个线程,并执行Execute,就会正常,而,当创建后挂起,再Resume的时候,所有的线程内的端口数据(传入的 变量I) 都成了最后的那个了(就是端口数本来是从0到N的,但是现在却都是N了)。
cclq 2005-03-22
  • 打赏
  • 举报
回复
是这样的,我想批量产生线程,然后再批量执行。
用一个循环(For I :=0 to N 的那种)Create线程,其中线程的Create函数传入的变量和循环的次数有关系(I 是一个宽口数),问题是假如我创建一个线程,并执行Execute,就会正常,而,当创建后挂起,再Resume的时候,所有的线程内的端口数据(传入的 变量I) 都成了最后的那个了。
QSmile 2005-03-22
  • 打赏
  • 举报
回复
没明白。你的意思
cclq 2005-03-22
  • 打赏
  • 举报
回复
看不出所以然,麻烦给个提示,谢谢
cclq 2005-03-22
  • 打赏
  • 举报
回复
kp1150(小蛛) :

procedure TThread.Resume;
var
SuspendCount: Integer;
begin
SuspendCount := ResumeThread(FHandle);
CheckThreadError(SuspendCount >= 0);
if SuspendCount = 1 then
FSuspended := False;
end;
cclq 2005-03-22
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/TopicView.asp?id=3844016

上面这个问题麻烦你关注一下。
cclq 2005-03-22
  • 打赏
  • 举报
回复
都是我自己顶的,呵呵。

在大富翁上有人说Msg有问题,都是一个变量。

我想了想,就明白了,俺犯了个低级错误。

那好吧,这里的分全是你的了
kp1150 2005-03-22
  • 打赏
  • 举报
回复
哪裡,我也是瞎碰的!!
問你個問題:怎麼回復人的名字都是cclq啊!?
自己頂自己麼?
cclq 2005-03-22
  • 打赏
  • 举报
回复
FString:=InputStringList;//我覺得這句話有問題!
确实有问题,问题已经解决,用了MyThread的私有成员变量,String or Integer 类型的就OK了
kp1150(小蛛),看不出来,你还挺厉害的。


kp1150 2005-03-21
  • 打赏
  • 举报
回复
看resume代碼!
cclq 2005-03-21
  • 打赏
  • 举报
回复
ding
cclq 2005-03-21
  • 打赏
  • 举报
回复
ding

5,391

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧