![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Оценить поток на основе TClientSocket
FearG0 © (2007-09-30 01:48:00)Для своего приложения я использую поток. Просьба оценить его безглючность и возможные утечки в памяти.
unit ActivationThread;
interface
uses
Windows, SysUtils, Classes,dialogs,ScktComp,messages;
type
TActivationThread = class(TThread)
private
{ Private declarations }
FSock: TClientSocket;
Freceived,Frequest: string;
FHandle: HWND;
FUsername,Femail,FActivationCode:String ;
FcodeError:integer;
procedure OnConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure OnDisconnect(Sender: TObject; Socket: TCustomWinSocket);
procedure OnWrite(Sender: TObject; Socket: TCustomWinSocket);
procedure OnError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ReadEvent(Sender: TObject; Socket: TCustomWinSocket);
protected
procedure Execute; override;
public
constructor Create(CreateSuspennded: Boolean;AUsername,Aemail,AActivationCode:String; const AHandle:HWND);
destructor Destroy; override;
end;
implementation
constructor TActivationThread.Create(CreateSuspennded: Boolean;AUsername,Aemail,AActivationCode:String; const AHandle:HWND);
begin
inherited Create(true);
FUsername:= AUsername ;
Femail:= Aemail ;
FActivationCode:= AActivationCode ;
FHandle:= AHandle;
FreeOnTerminate:=true;
if createSuspennded = false then resume;
end;
destructor TActivationThread.Destroy;
begin
FSock.Free;
inherited;
end;
procedure TActivationThread.OnConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
Freceived:='';
Socket.SendText(FRequest);
end;
procedure TActivationThread.OnDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
PostThreadMessage(ThreadId,WM_CLOSE,0,0);
end;
procedure TActivationThread.OnError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
FCodeError := ErrorCode;
ErrorCode := 0;
Socket.Close;
end;
procedure TActivationThread.OnWrite(Sender: TObject; Socket: TCustomWinSocket);
begin
//Socket.Close;
end;
procedure TActivationThread.ReadEvent(Sender: TObject;
Socket: TCustomWinSocket);
begin
FReceived:=FReceived+Socket.ReceiveText;
end;
procedure TActivationThread.Execute;
var
Msg: TMsg;
i,j:integer;
FContent,SitePortion:string;
StartTime:TDatetime; SecondsCount: integer;
arr:stringarray;
ResState:boolean;
begin
try
SetLength(arr,0);
FSock := TClientSocket.Create(nil);
//ShowMessage(GetAddress(Furl));
FSock.Host:= 'www.xxxxx.ru';
FSock.Port := 80;
FSock.OnConnect := OnConnect;
FSock.OnDisconnect := OnDisconnect;
FSock.OnWrite := OnWrite;
FSock.OnError := OnError;
FSock.OnRead := ReadEvent;
FContent:='username='+HTTPTran(FuserName)+'&email='+HTTPTran(Femail)+'&ActivationCode='+HTTPTran(FActivationCode);
FContent:=
'Content-Length: '+IntToStr(Length(FContent))+#13#10+#13#10+FContent+#13#10;
FRequest:='POST /activation.exe HTTP/1.0'+#13#10+
'Content-Type: application/x-www-form-urlencoded'#13#10+
'Accept: */*'+#13#10+
'Accept-Language: ru-RU;q=1.0,en;q=0.5'+#13#10+
'User-Agent: MSIE 6.0'+#13#10+
'Host: www.xxxxx.ru'+#13#10+
'Connection: Close'+#13#10+FContent;
PeekMessage(Msg,0,0,0,PM_REMOVE);
StartTime:=Now;
Freceived:='';
FSock.Open;
while GetMessage(Msg,0,0,0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
if Msg.message=WM_CLOSE then break;
if Terminated then exit;
if SecondsBetween(Now,StartTime)>30 then
begin
FSock.Close;
SendMessage(FHandle,WM_USER + 3260,0,-2);
exit;
end;
end;
FSock.Close;
Freceived:=UTF8ToStrSmart(Freceived);
Freceived:=RemoveHeader(Freceived);
SendMessage(FHandle,WM_USER + 3260,0,StrToInt(Freceived));
except
SendMessage(FHandle,WM_USER + 3260,0,-2);
end;
end;
end.
Сергей М. (2007-10-01 08:19:00) [21]
> FearG0 © (30.09.07 01:48)
Во избежание утечек и AV следует делать так:
procedure TActivationThread.Execute;
..
begin
..
//создаем гнездо
FSock := TClientSocket.Create(..);
try
.. работа с гнездом ..
finally
FSock.Free; //безусловно уничтожаем гнездо
end;
..
..
end;
> TranslateMessage(Msg);
Это лишнее.
> Slym © (01.10.07 04:31) [1]
>
> Pesтеs... В топку код..
> 1. Работа в НЕБЛОКИРУЮЩИМ сокетом в отдельном! потоке!
И что ? Почему бы и нет ?
Slym (2007-10-01 04:31:00) [22]Pesтеs... В топку код..
1. Работа в НЕБЛОКИРУЮЩИМ сокетом в отдельном! потоке!
2. Ржунимагу:
begin
inherited Create(true);
....
if createSuspennded = false then resume;
end;
гораздо проще
....
inherited Create(createSuspennded);
end;
3. Ты уверен что FSock всегда здесь существует? я нет :)
destructor TActivationThread.Destroy;
begin
FSock.Free;
inherited;
end;