Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Оценить поток на основе TClientSocket


Страницы:   1 2

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;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо