请教一下,帮帮忙!

  • 主题发起人 主题发起人 xe7
  • 开始时间 开始时间

xe7

Registered
Registered
注册
2015-05-12
消息
32
我用diocp的http,在OnHttpSvrRequest里面接收到数据处理的时候,有什么限制吗?比如是不是不能访问非线程安全的对象,在这里想要访问主线程是不是只能用iocptask?
 
比如我要在httprequest中访问redis。访问redis用到一个组件,里面会调用indy跟redis通讯。
 
OnHttpSvrRequest的触发是 iocpTask/Qworker的线程触发的。你访问资源要按照线程访问资源的规则去访问
 
如果访问主线程要做同步,如果访问共享资源要做临界(加锁)
 
[mw_shl_code=delphi,true]procedure TMainFrm.OnHttpSvrRequest(pvRequest: TDiocpHttpRequest);
var
lvJSon: ISuperObject;
lStateCode: Integer;
s, lUID, lToken: string;
lvRawData: ansiString;
begin
//Context Type 返回的是UTF-8的编码
pvRequest.Response.ContentType := 'text/html; charset=utf-8';

//解码Post数据参数
{$IFDEF UNICODE}
pvRequest.DecodePostDataParam(nil);
pvRequest.DecodeURLParam(nil);
{$ELSE}
pvRequest.DecodePostDataParam(false);
pvRequest.DecodeURLParam(false);
{$ENDIF}


if pvRequest.RequestURI = '/login' then //登录验证
begin
SetLength(lvRawData,pvRequest.RawPostData.Size);
pvRequest.RawPostData.Position := 0;
pvRequest.RawPostData.Read(PByte(lvRawData)^, pvRequest.RawPostData.Size);
lvJSon := SO(lvRawData);
//用户密码校验
//校验成功,生成一个串(如guid)返回给客户端,同时发送到gate server, 客户端根据这个串在gate那边校验
DoUserVerify(lvJSon['u'].AsString, lvJSon['p'].AsString, lStateCode, lUID, lToken);
mmoLog.Lines.Add('aa');
end else if pvRequest.RequestURI = '/register' then //新用户注册
begin

SetLength(lvRawData,pvRequest.RawPostData.Size);
pvRequest.RawPostData.Position := 0;
pvRequest.RawPostData.Read(PByte(lvRawData)^, pvRequest.RawPostData.Size);
lvJSon := SO(lvRawData);
//写入redis
FRedisClient.&SET(lvJSon['u'].AsString,lvJSon['p'].AsString);
//通知center server 把新账号入db库

end else if pvRequest.RequestURI = '/register' then //修改密码
begin

end else
begin
//无效操作
lStateCode:= 400;
lUID:= '';
lToken:= '';
end;
lvJSon := SO();
lvJSon.I['s'] := lStateCode;
lvJSon.S['u'] := lUID;
lvJSon.S['t'] := lToken;
s := lvJSon.AsJSon(True, False);
pvRequest.Response.WriteString(s);
//应答完毕,发送回客户端
pvRequest.ResponseEnd;
pvRequest.CloseContext;
end;[/mw_shl_code]
 
弦子,像上面那种代码要怎么改?帮忙看看,万分感谢!
 
FRedisClient,如果是个全局变量。应该不是线程安全的版本
 
如果FRedisClient.&SET是线程安全的,你这段代码没什么问题。
 
后退
顶部