线程无缘无故的退出(100分)

  • 主题发起人 主题发起人 systermman
  • 开始时间 开始时间
S

systermman

Unregistered / Unconfirmed
GUEST, unregistred user!
执行这段代码的时候,线程退出
//上传正式黑名单
procedure TUpLoad.UpLoadRegularList(Mark : Word);
var
li : Integer;
lj : Integer;
liTimes : Byte;
lPos : Word;
//指针的位置
ldevno : Byte;
liMod : Word;
lstrIp : string;
lstrName : string;
lstrNo : string;
lstrMsg : string;
lstrPath : string;
lstrCardSn : string;
lbflag : Boolean;//是否存在失败的标志
begin
try
if gTempList = nil then
//无黑名单记录
Exit;
lbflag := False;
lPos := 0;
lstrIp := '';
lstrIp := gPosList[Mark].gstrIp;
lstrName := '';
lstrName := gPosList[Mark].gstrName;
lstrNo := '';
lstrNo := gPosList[Mark].gstrNo;
ldevno := StrToInt(lstrNo);
lstrMsg := '';
lstrMsg := lstrName+'('+lstrNo + ')'+':';
for li:=0 to High(gTempList)-1do
begin
if li=0 then
//初始化黑名单列表
fPos_inithei(ldevno);
if li>7000 then
begin
lstrMsg := '';
lstrMsg := lstrMsg+'正式黑名单列表已满,不能再上传。';
Frm_Download.TeMemo1.Lines.Add(lstrMsg);
Break;
end;
//下载正式黑名单
liTimes := 0;
lstrCardSn := '';
lstrCardSn := gTempList[li].gstrCardSn;
while liTimes<3do
begin
if fPos_downhei2(ldevno,StrToInt64(lstrCardSn),li) then
begin
Frm_Download.TeMemo1.Lines.Add(lstrMsg +'上传(正式黑名单)'+lstrCardSn+'。');
lPos := lPos +1;
Break;
end
else
begin
if liTimes=2 then
lbflag := True;
Frm_Download.TeMemo1.Lines.Add(lstrMsg +'上传(正式黑名单)'+lstrCardSn+'失败。');
end;
liTimes :=liTimes + 1;
end;
end;
//不足64,补上
liMod := lPos mod 64;
for lj := 0 to 63-liModdo
begin
liTimes := 0;
while liTimes<3do
begin
if fPos_downhei2(ldevno,$FFFFFFFF,lPos) then
begin
lPos := lPos + 1;
Frm_Download.TeMemo1.Lines.Add(lstrMsg +'上传(正式黑名单)$FFFFFFFF。');
Break;
end
else
begin
if liTimes=2 then
lbflag := True;
Frm_Download.TeMemo1.Lines.Add(lstrMsg +'上传(正式黑名单)$FFFFFFFF失败。');
end;
liTimes := liTimes +1;
end;
end;
liTimes := 0;
while liTimes<3do
begin
if not fPos_saveheip2(ldevno,lPos-1) then
//设置黑名单总
Frm_Download.TeMemo1.Lines.Add('正式黑名单上传失败。')
else
begin
if not lbflag then
Self.DelUpload(lstrNo,lstrIp);
Frm_Download.TeMemo1.Lines.Add('正式黑名单上传完成。');
Frm_Download.TeMemo2.Lines.Add(lstrMsg + '上传正式黑名单总数:'+IntToStr(li)+' ('+FormatDatetime('mm-dd hh:mm:ss',Now)+')');
Exit;
end;
liTimes := liTimes +1;
end;
except
on e:Exceptiondo
begin
//lstrPath := '';
//lstrPath := ExtractFilePath(Application.ExeName)+'ini/log.txt';
//WriteLog(lstrPath,FormatDatetime('mm-dd hh:mm:ss',Now)+':'+e.Message);
Frm_Download.TeMemo2.Lines.Add(e.Message);
end;
end;
end;
线程是这样唤起的如下:
with FthreadList.LockListdo
try
if Count =0 then
begin
gbStop := True;
Exit;
end;
FthreadNum:=Count;
for li:= 0 to Count-1do
begin
TUpLoad(Items[li]).Resume;
//重新唤起线程进行操作
TUpLoad(Items[li]).ConStr := con1.ConnectionString;
end;
finally
FthreadList.UnlockList;
FthreadList := nil;
end;
 
是否在操作vcl控件时出错!!
Frm_Download.TeMemo1.Lines.Add()
高手都到哪里了!!
 
大虾帮帮忙!!
 
其中gTempList[li]是一个黑名单列表数组。
 
呵呵,我也遇到唤起线程没反应的问题,不知道是什么原因。
 
建议楼主先将代码简化,然后逐步调试。
 
是呀
线程内使用VCL,要进行同步。
 
现在没有时间看[:D]
 
时报平,说得对.
你没做同步.
 
后退
顶部