IdHTTPServer 和 线程的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 dawndang
  • 开始时间 开始时间
D

dawndang

Unregistered / Unconfirmed
GUEST, unregistred user!
使用IdHTTPServer 相应客户端页面请求的时候 针对 IdHTTPServer1CommandGet 事件编程,
从服务器端读取数据流经过简单的解密处理发回给客户端
问题就出在解密处理的时候,解密使用的一个类,
由于indy控件实现了多线程的访问,导致 在解密过程中 第一个文件还没有解密完成 第二个下载文件的请求同时到,同时又调用了解密类 这样造成了 数据混乱,

我尝试过吧解密类放到一个线程中去单独处理,但是在创建线程的时候被告知无效的线程id
下面这段代码就是使用线程解密的事件响应代码 拜请过目

procedure TForm3.IdHTTPServer1CommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
ss : Tmemorystream;
rUrl:string;
m:TMake;
send:TSendContent;
begin
m := Tmake.Create('1.store');
rUrl := ARequestInfo.Document;
ss := TmemoryStream.Create;
if rUrl='/' then
m.GetFileByName(m.Fdata.HomePage,ss,FILE_ENCRYPT_KEY)
else
begin
send := TSendContent.Create('1.store',MidStr(rUrl,2,Length(rUrl)),ss);//这里创建线程失败
end;
AResponseInfo.ContentStream := ss;
AResponseInfo.WriteContent;
m.Free;
 
使用IdHTTPServer 相应客户端页面请求的时候 针对 IdHTTPServer1CommandGet 事件编程,
从服务器端读取数据流经过简单的解密处理发回给客户端
问题就出在解密处理的时候,解密使用的一个类,
由于indy控件实现了多线程的访问,导致 在解密过程中 第一个文件还没有解密完成 第二个下载文件的请求同时到,同时又调用了解密类 这样造成了 数据混乱,

我尝试过吧解密类放到一个线程中去单独处理,但是在创建线程的时候被告知无效的线程id
下面这段代码就是使用线程解密的事件响应代码 拜请过目

procedure TForm3.IdHTTPServer1CommandGet(AContext: TIdContext;
ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
ss : Tmemorystream;
rUrl:string;
m:TMake;
send:TSendContent;
begin
m := Tmake.Create('1.store');
rUrl := ARequestInfo.Document;
ss := TmemoryStream.Create;
if rUrl='/' then
m.GetFileByName(m.Fdata.HomePage,ss,FILE_ENCRYPT_KEY)
else
begin
send := TSendContent.Create('1.store',MidStr(rUrl,2,Length(rUrl)),ss);//这里创建线程失败
end;
AResponseInfo.ContentStream := ss;
AResponseInfo.WriteContent;
m.Free;
 
send := TSendContent.Create('1.store',MidStr(rUrl,2,Length(rUrl)),ss);//这里创建线程失败
线程的create方法应该贴出来吧
 
在IdHTTPServer 控件实现中是不是针对客户端的每一个下载请求都会启动一个线程然后触发
IdHTTPServer1CommandGet
事件?
也就是说 IdHTTPServer1CommandGet 事件是在控件的某一个线程中被调用的?

就是简单的赋值
type
TSendContent = class(TThread)
private
{ Private declarations }
m:TMake;

ARequestInfo: TIdHTTPRequestInfo;
AResponseInfo: TIdHTTPResponseInfo;
protected
procedure Execute; override;
public
fSrcName:string;
fFileName:string;
fFs:TMemoryStream;
constructor Create(srcName:string;FileName:string;outFileStream:TMemoryStream);

end;

implementation

{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,

Synchronize(UpdateCaption);

and UpdateCaption could look like,

procedure SendContent.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }

{ SendContent }



constructor TSendContent.Create(srcName, FileName: string;
outFileStream: TMemoryStream);
begin
{ fSrcName := srcName;
fFileName := FileName;
fFs := outFileStream;}//这里注释掉是为了测试是否能成功创建线程
end;

procedure TSendContent.Execute;
var
m : TMake;
begin
m := TMake.Create(fSrcName);
m.GetFileByName(fFileName,ffs,FILE_ENCRYPT_KEY);
m.Free;
end;
 
constructor TSendContent.Create(srcName, FileName: string;
outFileStream: TMemoryStream);
begin
inherited Create(false);
{ fSrcName := srcName;
fFileName := FileName;
fFs := outFileStream;}//这里注释掉是为了测试是否能成功创建线程
end;
另:IdHTTPServer1CommandGet 事件是在线程中执行的
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部