线程里一个很简单的计数器的问题 急(20分)

  • 主题发起人 主题发起人 carrie4002
  • 开始时间 开始时间
C

carrie4002

Unregistered / Unconfirmed
GUEST, unregistred user!
在一个线程里有一个计数器,可跟踪调试时发现这个计数器没有随线程的多次执行而改变。是怎么回事呢?
 
什么计数器?TTimer?最好说详细点,再把代码帖出来。
 
TO zqw0117,skyccf:
谢谢二位。
代码:
procedure TSerialMonitorThread.Execute; //监视串口:
var //串口C、E、N三个通道
i:integer;
Cdata,Edata,Ndata:Double; //串口C、E、N三个通道读出的数据的临时存储
const
sbufC:array[1..4] of byte=($3F,$6C,$C1,$2E); //C,E,N通道命令字
sbufE:array[1..4] of byte=($3F,$6C,$C2,$2E);
sbufN:array[1..4] of byte=($3F,$6C,$C3,$2E);
begin
RowK2000Recv:=RowK2000Recv+1; //计数器RowK2000Recv加1(在该线程启动处初值为-1)
Form1.K2000Monitor[RowK2000Recv].ChlNo:=RowK2000Recv; //记录数组的序号
Cdata:=0;Edata:=0;Ndata:=0;
while not Terminated do //线程未终止时执行的代码
begin
try
Form1.k2000Init; //数字表串口初始化
Form1.CommVstr.StartComm;
Form1.CommVstr.WriteCommData(@sbufC,sizeof(sbufC));//扫描仪扫描串口的C通道
Sleep(200);
Form1.k2000Read(); //读数字表数据
Cdata:=Form1.tempdata;
Form1.CommVstr.WriteCommData(@sbufE,sizeof(sbufE)); //扫描到E通道
Sleep(200);//延时0.2秒再读数据
Form1.k2000Read();
Edata:=Form1.tempdata-Cdata;
Form1.CommVstr.WriteCommData(@sbufN,sizeof(sbufN)); //扫描N通道
Sleep(200);
Form1.k2000Read();
Ndata:=Form1.tempdata-Cdata;
Form1.CommVstr.StopComm;
Sleep(200);
Form1.K2000Monitor[RowK2000Recv].WD:=((Edata/Ndata)*100; //求出E通道温度存进数组
except
end;
sleep(2000); //延时2秒后再执行线程
end;
end;
哪里的问题?RowK2000Recv为何不随线程执行次数的改变而改变?
 
RowK2000Recv:=RowK2000Recv+1; //计数器RowK2000Recv加1(在该线程启动处初值为-1)
Form1.K2000Monitor[RowK2000Recv].ChlNo:=RowK2000Recv; //记录数组的序号
Cdata:=0;Edata:=0;Ndata:=0;
加到
while not Terminated do //线程未终止时执行的代码
begin
try
后就可以了
 
原因在于你的多线程Execute只是线程执行的入口
只执行一次
若执行完里面的代码线程将根据你的设置自动释放或者需要你手动释放
你真正的循环实际是while里面的内容
 
to muhx:
谢谢你。我试一下。
 
muhx说的是对的
 
多人接受答案了。
 
后退
顶部