一个关于idhttp的多线程使用的问题

ientium 2006-11-07 02:49:53
登陆一个网页的程序,在idhttp POST的时候系统就会不响应,想用多线程解决一下,因为用那个IdAntiFreeze1不怎么理想,发现程序变得很慢,而且以后还会用到get抓网页数据就用多线程写一下
//######################线程单元部分####################################
unit TUThreadUnit;
interface
uses
Classes,ComCtrls,Controls,SysUtils,DateUtils,Forms,IdHTTP,Dialogs;

type
Loginthread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
public
end;

implementation

uses GlobalUnit,LoginUnit;


procedure Loginthread.Execute;
var
Responses : TStringStream ;
PostData: TStrings;
timekey,PHPSeesion,surl,tt :string;
Cookie,serverurl : string;
i : integer;
x :integer;
idHttpthread :TIdHTTP;
begin

timekey :=IntToStr(DateTimeToUnix(Now)-32400);
Responses := TStringStream.Create('');
PostData:=TStringlist.Create;
PostData.Add('timestamp='+timekey);
PostData.Add('v=2');
PostData.Add('login='+Utf8encode(FormLogin.EUsername.text));
PostData.Add('pass=' + Utf8encode(FormLogin.EPassword.text));
idHttpthread.HandleRedirects := True;
serverurl := serverinifile.ReadString('SERVER_URL','Server'+IntToStr(FormLogin.ComboBox1.ItemIndex+1),'');
try try
FormLogin.IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded' ;

FormLogin.IdHTTP1.Post('http://'+serverurl+'/game/reg/login2.php', PostData, Responses);

x:= Pos('session=',Responses.DataString);
PHPSeesion := trim(Copy(Responses.DataString,x+8,12));

Except
on E: Exception do
showmessage('Error encountered during POST: ' + E.Message);
end;
finally
FreeAndNIl(PostData);
ResPonses.Free;
end;

end;
end.
//######################程序中部分####################################


//******************************************************
//* 登陆
//******************************************************

function TFormLogin.login():Boolean;
var
Responses : TStringStream ;
PostData: TStrings;
timekey,PHPSeesion,surl,tt :string;
Cookie,serverurl : string;
i : integer;
x :integer;
mythread:Loginthread;
begin
Imagebg.Visible:= True;
Imageleft.Visible:= True;
ImageBar.Visible:= True;
ImageRight.Left := ImageBar.left+ImageBar.Width;
ImageRight.Visible:= True;
LabMess.Caption :='准备登陆...';
//线程调用部分
mythread.Create(true);

if Pos('<',PHPSeesion)>0 then
begin
LabMess.Caption :='登陆失败,请重新登陆!';
//登陆失败
ImageBar.Width:= 115;
Imageright.Visible:= True;
Imageleft.Visible:= False;
ImageBar.Visible:= False;
Imageright.Visible:= False;
Imagebg.Visible:= False;
end
else
begin
for i := 0 to FormLogin.idHttp1.Response.RawHeaders.Count -1 do
if UpperCase(LeftStr(FormLogin.idHttp1.Response.RawHeaders[i], 10)) = 'SET-COOKIE' then
begin
Cookie := Trim(Copy(FormLogin.idHttp1.Response.RawHeaders[i], 12, MaxInt));
Cookie := Copy(Cookie, 1, Pos(';', Cookie) - 1);
FormLogin.idHttp1.Request.RawHeaders.Add('Cookie:'+ Cookie);
FormLogin.idHttp1.CookieManager.AddCookie(Cookie,serverurl);
end;
//登陆成功,处理User
LabMess.Caption :='初始化信息!';
User.StartTime := DateTimeToUnix(Now);
User.LastTime := StrToInt(serverinifile.ReadString('SER_INFO','lasttime','0'));
User.Universe := FormLogin.ComboBox1.ItemIndex+1;
User.System := serverurl;
User.LoginName := Utf8encode(FormLogin.EUsername.text);
User.LoginPassWord := Utf8encode(FormLogin.EPassword.text);
User.Login := True;
User.timeamp := StrToInt(serverinifile.ReadString('SER_INFO','timeamp','0'));
User.Session := PHPSeesion;
ImageBar.Width:= 15;
ImageRight.Left := ImageBar.left+ImageBar.Width;
end;
Result := User.Login;
end;


结果执行
mythread.Create(true);异常,
哪位大哥给看看啊
...全文
254 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
天涯倦客 2006-11-07
  • 打赏
  • 举报
回复
顶ls的
do2008 2006-11-07
  • 打赏
  • 举报
回复
对象的实例化,没有" 实例变量名.create "这种写法,

需要这样:
实例变量名 := 类.create(...) ,这个Object Pascal 的基本语法
do2008 2006-11-07
  • 打赏
  • 举报
回复
这一句mythread.Create(true);异常,

改为: mythread:= Loginthread.Create(true);

5,388

社区成员

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

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