Q
qingtz
Unregistered / Unconfirmed
GUEST, unregistred user!
我在用idhttp来post网页的时候窗体就死了,后来用了IdAntiFreeze后在post一个网页的时候还能解决,可是用for循环post一组网页的时候就会又死了,谁知道怎么解决?
下面是代码
单个网页post的时候我调用ref(id,id);两个参数的值相等,就相当于循环一次,这时候窗口不会死
多个网页post的时候我调用ref(id1,id2);这个时候就死了,要等到全部post完才能缓过来
求各位大侠帮忙解决一下^_^ 如何把下面的代码改成多线程在后台运行,希望附上代码,能用的话我给加分
procedure Ref(beginid,endid:integer);
var
m,i,a,b,c,j:integer;
username,password,billadd,email,key,dealstr,resultstr,d:string;
RSL:tstringlist;
begin
RSL:=TStringList.Create;
statsset(beginid,endid); //调用函数 将第2个id的状态全改为等待中(因为不会编多线程,只能一个一个的等
for m:=beginid to endid do
begin
d:='';
if stopctrl=true then //stopctrl是全局变量,当post多个网页的时候形同虚设,窗口一死更本无法改变其值
break;
with form1.ClientDataSet1 do
begin
IndexFieldNames:='ID';
if FindKey([m]) then
begin
username:=fieldvalues['用户名'];
password:=fieldvalues['密码'];
billadd:=fieldvalues['帐户地址'];
email:=fieldvalues['注册邮箱'];
key:= fieldvalues['关键字'];
end;
end;
rsl.Add('username='+username);
rsl.Add('password='+password);
rsl.Add('email='+email);
rsl.Add('user='+username);
rsl.Add('pw='+password);
rsl.Add('action=Login to My Accoun');
form1.ClientDataSet1.Edit;
form1.ClientDataSet1.FieldValues['状态']:='连接中...';
form1.ClientDataSet1.post;
try
form1.IdAntiFreeze1.OnlyWhenIdle:=false;
dealstr:=stringreplace(ansilowercase(form1.IdHTTP1.post(billadd,RSL)),' ','',[rfreplaceall]);//post网页并给dealstr赋值
b:=length(dealstr); //从这儿开始在dealstr中搜索需要的字符
if pos(key,dealstr)>0 then
for c:=pos(key,dealstr) to b-10 do
if dealstr[c]='$' then
begin
i:=c+1;
break;
end;
for j:=i to i+10 do
if (dealstr[j]='.') or ((dealstr[j]>='0') and (dealstr[j]<='9')) then
begin
d:=d+dealstr[j]; //搜索完成并把找到的字符赋值给d
end;
with form1.ClientDataSet1 do //把d写入ClientDataSet1,并更新状态
begin
IndexFieldNames:='ID';
if FindKey([m]) then
form1.ClientDataSet1.Edit;
form1.ClientDataSet1.FieldValues['当前金额']:=strtofloat(d);
form1.ClientDataSet1.FieldValues['状态']:='更新完成';
form1.ClientDataSet1.FieldValues['更新日期']:=now;
form1.ClientDataSet1.post;
end;
rsl.Clear;
except
form1.ClientDataSet1.Edit;
form1.ClientDataSet1.FieldValues['状态']:='更新失败';
form1.ClientDataSet1.FieldValues['更新日期']:=now;
form1.ClientDataSet1.post;
rsl.Clear;
end;
application.ProcessMessages;
end;
rsl.Destroy;
end;
procedure statsset(beginid,endid:integer);
var
m:integer;
begin
for m:=beginid+1 to endid do
with form1.ClientDataSet1 do
begin
IndexFieldNames:='ID';
if FindKey([m]) then
begin
form1.ClientDataSet1.Edit;
fieldvalues['状态']:='等待中...';
form1.ClientDataSet1.post;
end;
end;
end;
跪求多线程代码
下面是代码
单个网页post的时候我调用ref(id,id);两个参数的值相等,就相当于循环一次,这时候窗口不会死
多个网页post的时候我调用ref(id1,id2);这个时候就死了,要等到全部post完才能缓过来
求各位大侠帮忙解决一下^_^ 如何把下面的代码改成多线程在后台运行,希望附上代码,能用的话我给加分
procedure Ref(beginid,endid:integer);
var
m,i,a,b,c,j:integer;
username,password,billadd,email,key,dealstr,resultstr,d:string;
RSL:tstringlist;
begin
RSL:=TStringList.Create;
statsset(beginid,endid); //调用函数 将第2个id的状态全改为等待中(因为不会编多线程,只能一个一个的等
for m:=beginid to endid do
begin
d:='';
if stopctrl=true then //stopctrl是全局变量,当post多个网页的时候形同虚设,窗口一死更本无法改变其值
break;
with form1.ClientDataSet1 do
begin
IndexFieldNames:='ID';
if FindKey([m]) then
begin
username:=fieldvalues['用户名'];
password:=fieldvalues['密码'];
billadd:=fieldvalues['帐户地址'];
email:=fieldvalues['注册邮箱'];
key:= fieldvalues['关键字'];
end;
end;
rsl.Add('username='+username);
rsl.Add('password='+password);
rsl.Add('email='+email);
rsl.Add('user='+username);
rsl.Add('pw='+password);
rsl.Add('action=Login to My Accoun');
form1.ClientDataSet1.Edit;
form1.ClientDataSet1.FieldValues['状态']:='连接中...';
form1.ClientDataSet1.post;
try
form1.IdAntiFreeze1.OnlyWhenIdle:=false;
dealstr:=stringreplace(ansilowercase(form1.IdHTTP1.post(billadd,RSL)),' ','',[rfreplaceall]);//post网页并给dealstr赋值
b:=length(dealstr); //从这儿开始在dealstr中搜索需要的字符
if pos(key,dealstr)>0 then
for c:=pos(key,dealstr) to b-10 do
if dealstr[c]='$' then
begin
i:=c+1;
break;
end;
for j:=i to i+10 do
if (dealstr[j]='.') or ((dealstr[j]>='0') and (dealstr[j]<='9')) then
begin
d:=d+dealstr[j]; //搜索完成并把找到的字符赋值给d
end;
with form1.ClientDataSet1 do //把d写入ClientDataSet1,并更新状态
begin
IndexFieldNames:='ID';
if FindKey([m]) then
form1.ClientDataSet1.Edit;
form1.ClientDataSet1.FieldValues['当前金额']:=strtofloat(d);
form1.ClientDataSet1.FieldValues['状态']:='更新完成';
form1.ClientDataSet1.FieldValues['更新日期']:=now;
form1.ClientDataSet1.post;
end;
rsl.Clear;
except
form1.ClientDataSet1.Edit;
form1.ClientDataSet1.FieldValues['状态']:='更新失败';
form1.ClientDataSet1.FieldValues['更新日期']:=now;
form1.ClientDataSet1.post;
rsl.Clear;
end;
application.ProcessMessages;
end;
rsl.Destroy;
end;
procedure statsset(beginid,endid:integer);
var
m:integer;
begin
for m:=beginid+1 to endid do
with form1.ClientDataSet1 do
begin
IndexFieldNames:='ID';
if FindKey([m]) then
begin
form1.ClientDataSet1.Edit;
fieldvalues['状态']:='等待中...';
form1.ClientDataSet1.post;
end;
end;
end;
跪求多线程代码