Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Вниз

Ищу работу в Москве.   Найти похожие ветки 

 
VID ©   (2004-09-01 09:42) [0]

Новая ветка о старом.
Моё резюме (если есть замечания по существу, рад их услышать, однако, просто выёживаться ненадо):

----------------------------------------------------

31.08.2004 17:49:51 | Должность: Программист  
Город: Москва
Пол: Муж
Возраст: 23
Образование: Высшее
Опыт работы: 2 года
Занятость: Полная
Зарплата от: 1000 $

Профессиональные навыки:

Прикладное программирование, проектирование, разработка компонентов, ООП, английский (технический + общий на среднем уровне). Занимаюсь созданием клиент-серверных приложений БД на основе Interbase. Хорошо знаю SQL. Имею опыт работы с такими продуктами как Borland Delphi 5, Interbase, Yaffil, IBExpert, Visual Basic for Applications(написание кода под приложения из пакета Microsoft Office), Microsoft Visual FoxPro 5, 6, 7, а также с такими технологиями как Client/Server, VCL-сокеты, ActiveX, OLE, WinAPI, HTML. Трудолюбив, ответственен, не конфликтен. Люблю изучать новые области знаний.

Образование:

Высшее. В 2003 году окончил Дагестанский Государственный Университет, факультет управления экономикой, специальность Информационные системы в экономике .

Опыт работы:

В целом, опыт работы с Delphi составляет четыре с половиной года, из них последние полтора года (2003-2004) работаю в должности программист в Дагестанской Медицинской Академии.

----------------------------------------------------

Для контакта со мной, пишите на e-mail: vidsnap#mail.ru, icq#: 132234868.


 
stone ©   (2004-09-01 09:44) [1]

http://delphimaster.net/view/14-1093923774/


 
VID ©   (2004-09-01 09:59) [2]

stone ©   (01.09.04 9:44) [1]
прочитал...

ну опыт то есть... давайте я здесь приведу исходники двух модулей моей последней программки (обычный сокет-сервер), как демонстрацию моего стиля программирования, а вам судить...


 
VID ©   (2004-09-01 10:02) [3]

unit main;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ComCtrls, AppEvnts, StdCtrls, recvpckt, ScktComp, inifiles, BestTools,
 WinSock, ExtCtrls, ActnList, Menus, rserver_global, RXShell, SocketThreadUnit;

type
 TLogin = String[255];
 TPassword = String[32]; //MD5-compatible size
 TAccount = record
   Login : TLogin;
   Password : TPassword;
   Position : Longint;
 end;
 TPTPPermission = record
   Logins:String;
   PTPEnabled:Boolean;
 end;
 TRServerSocketThread = class(TSocketThread)
   FReceiveBuffer:TBuffer;
   FAccount:TAccount;
   FLastActivity:Cardinal;  //TickCount
   FTargetLogins:String; //Логины клиентов через ListDelimiter
   FPeerToPeer:Boolean;
   FPTPPermission:TPTPPermission;
   Function FormatNetMessage(const Msg:String):String;
   Procedure SendNetMessage(TargetSocketThread:TSocketThread; const Msg:String);
   Procedure SendText(TargetSocketThread:TSocketThread; const Text:String);
 end;
 TSocketThreadArr = array of TRServerSocketThread;
 TfrmMain = class(TForm)
   PageControl1: TPageControl;
   TabSheet1: TTabSheet;
   TabSheet2: TTabSheet;
   Stat: TStatusBar;
   AE: TApplicationEvents;
   Log: TMemo;
   Server: TServerSocket;
   MainMenu1: TMainMenu;
   ActionList1: TActionList;
   aStart: TAction;
   aStop: TAction;
   Connection1: TMenuItem;
   Startserver1: TMenuItem;
   Stopserver1: TMenuItem;
   N1: TMenuItem;
   aExit: TAction;
   Exit1: TMenuItem;
   Memo1: TMemo;
   Tray: TRxTrayIcon;
   aGetInfo: TAction;
   N2: TMenuItem;
   Getinfo1: TMenuItem;
   Procedure SetTitle(const S:String);
   procedure FormCreate(Sender: TObject);
   Procedure ShowStat(Column:Integer; const S:String);
   procedure AEMinimize(Sender: TObject);
   procedure AERestore(Sender: TObject);
   Procedure StartServer;
   Procedure StopServer;
   procedure AEIdle(Sender: TObject; var Done: Boolean);
   Function GetAuthCount:Integer;
   Procedure AddLog(LogText:String);
   procedure ServerClientConnect(Sender: TObject;
     Socket: TCustomWinSocket);
   procedure ServerAccept(Sender: TObject; Socket: TCustomWinSocket);
   procedure FormResize(Sender: TObject);
   Procedure RemoveSilentClients(var RemovedCount:Integer);
   Procedure PingClients(var PingedCount, DisconnectedCount:Integer);
   procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
   procedure aStartExecute(Sender: TObject);
   procedure aStopExecute(Sender: TObject);
   procedure aExitExecute(Sender: TObject);
   procedure ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
   procedure TrayMouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   Function CreateSocketThread(Socket:TCustomWinSocket):TRServerSocketThread;
   procedure ServerClientError(Sender: TObject; Socket: TCustomWinSocket;
     ErrorEvent: TErrorEvent; var ErrorCode: Integer);
   procedure ServerClientDisconnect(Sender: TObject;
     Socket: TCustomWinSocket);
   procedure aGetInfoExecute(Sender: TObject);
   Procedure LoadTrayIcon;
 private
   { Private declarations }
 public
   { Public declarations }
 end;

 procedure ExecutePacketProc(SocketThread:TSocketThread);

var
 frmMain: TfrmMain;
 WaitBeforeDisconnectValue:Cardinal;
 PingInterval, PingedLastActivityValue:Cardinal;
 CurrentLocalIP:String;
 gTotalInCount:Integer = 0;//Переменная входящего траффика.
 gTotalOutCount:Integer = 0;//Переменная исходящего траффика

implementation

uses ServiceThreadUnit;

 Function GetSocketThreadsByLogins(const Logins:String; var SocketThreadArr:TSocketThreadArr):Integer; forward;
 Procedure ClientAuthentification(SocketThread:TRServerSocketThread; var RServerPacket:TRServerPacket); forward;
 Function WriteAccount(var Account:TAccount):Boolean;forward;
 Function ReWriteAccount(const Account:TAccount):Boolean;forward;
 Function ReadAccount(const Account:TAccount):TAccount;forward;
 Procedure ClearAccount(var Account:TAccount);forward;
 Function Local_SendPacket(const Packet:String; SocketThread:TSocketThread):Integer; forward;

const
 ProjName = "RServer";
 cMaxConnections = -1;
 cDefaultPort = 1026;
 cWaitBeforeDisconnect = 900;//seconds
 cPingInterval = 0;//seconds
 cPingedLastActivityValue = 300;//seconds
 cAutoRegistrationEnabled = True;

Var gMinimized : Boolean = False;
   ShowLogs:Boolean = True;
   MaxConnections:Integer = cMaxConnections;
   ProjVer,Way,IniFName,AccountFName:String;
   AutoRegistrationEnabled:Boolean = cAutoRegistrationEnabled;
   CriticalSection1:TRTLCriticalSection; //Для работы с файлом аккаунтов
   ServiceThread:TServiceThread;

{$R *.DFM}

{ TRServerSocketThread }

Function TfrmMain.CreateSocketThread(Socket:TCustomWinSocket):TRServerSocketThread;
begin
 Result := TRServerSocketThread.Create(False, Socket, ExecutePacketProc, True);
 With Result do
 begin
   ClearBuffer(FReceiveBuffer);
   FAccount.Login := "";
   With FPTPPermission do
   begin
     Logins := "";
     PTPEnabled := True;
   end;
   FTargetLogins := "";
   FLastActivity := GetTickCount;
   FPeerToPeer:=False;
 end;
end;

Function TRServerSocketThread.FormatNetMessage(const Msg:String):String;
begin
 Result := CreatePacket(RServer_Command, RServer_Message+CreateParams([Msg]));
end;

Procedure TRServerSocketThread.SendNetMessage(TargetSocketThread:TSocketThread; const Msg:String);
begin
 SendText(TargetSocketThread, FormatNetMessage(Msg));
end;

Procedure TRServerSocketThread.SendText(TargetSocketThread:TSocketThread; const Text:String);
Var X:Integer;
begin
 X := inherited SendText(TargetSocketThread, Text, -1);
 Inc(gTotalOutCount, X);
end;

{ end TRServerSocketThread }


не до конца естесно, больше скрипт не позволяет.. но и так думаю понятно, а щас второй модуль.


 
VID ©   (2004-09-01 10:03) [4]

хм.. нет думаю ещё с первого есть смысл добавить


Function Local_SendPacket(const Packet:String; SocketThread:TSocketThread):Integer;
begin
 Result := 0;
 try
   IF not SocketThread.FSendingText then
   begin
     Result := SendPacket(Packet, SocketThread.FSocket);
     IF Result>0 then Inc(gTotalOutCount, Result);
   end;
 except end;
end;

//Вызывается из потока
Function WriteAccount(var Account:TAccount):Boolean;
Var FileStream:TFileStream;
begin
 IF FileExists(AccountFName) then
   FileStream := TFileStream.Create(AccountFName, fmOpenReadWrite)
 else FileStream := TFileStream.Create(AccountFName, fmCreate);
 try
   With FileStream do
   begin
     Position := FileStream.Size;
     Account.Position := Position;
     WriteBuffer(Account, SizeOf(Account));
     Result := True;
   end;
 finally
   FileStream.Free;
 end;
end;

//Вызывается из потока
Function ReWriteAccount(const Account:TAccount):Boolean;
Var FileStream:TFileStream;
   TempAccount:TAccount;
begin
 Result := False;
 IF FileExists(AccountFName) then
   FileStream := TFileStream.Create(AccountFName, fmOpenReadWrite)
 else FileStream := TFileStream.Create(AccountFName, fmCreate);
 try
   ClearAccount(TempAccount);
   With FileStream do
   begin
     Position := Account.Position;
     ReadBuffer(TempAccount, SizeOf(TempAccount));
     IF AnsiUpperCase(Account.Login) = AnsiUpperCase(TempAccount.Login) then
     begin
       Position := Account.Position;
       WriteBuffer(Account, SizeOf(Account));
       Result := True;
     end;
   end;
 finally
   FileStream.Free;
 end;
end;

//Вызывается из потока
Procedure ClearAccount(var Account:TAccount);
begin
 With Account do
 begin
   Login := "";
   Password := "";
   Position := -1;
 end;
end;

//Вызывается из потока
Function ReadAccount(const Account:TAccount):TAccount;
Var FileStream:TFileStream;
begin
 ClearAccount(Result);
 IF not FileExists(AccountFName) then exit;
 FileStream := TFileStream.Create(AccountFName, fmOpenRead + fmShareDenyNone);
 try
   With FileStream do
     While Position < Size do
       try
         ReadBuffer(Result, SizeOf(Result));
         IF AnsiUpperCase(Account.Login) = AnsiUpperCase(Result.Login) then exit;
       except Position := Size end;
     ClearAccount(Result);
 finally
   FileStream.Free;
 end;
end;

Procedure TfrmMain.LoadTrayIcon;
Var ResourceStream:TResourceStream;
   S:String;
begin
 IF Server.Active then S := "ICON_C" else S := "ICON_G";
 ResourceStream := TResourceStream.Create(HINSTANCE, S, RT_RCDATA);
 try
   Tray.Icon.LoadFromStream(ResourceStream);
 finally
   ResourceStream.Free;
 end;
end;

//Вызывается из потока
Function TfrmMain.GetAuthCount:Integer;
Var I:Integer;
begin
 Result := 0;
 For I:=Server.Socket.ActiveConnections - 1 downto 0 do
   try
     IF TRServerSocketThread(Server.Socket.Connections[I].Data).FAccount.Login <> "" then Inc(Result);
   except end;
end;

Procedure TfrmMain.AddLog(LogText:String);
Const LinesLimit = 600;
begin
 IF not ShowLogs then Exit;
 Log.Lines.Add(DateTimeToStr(Now)+": "+LogText);
 while Log.Lines.Count > LinesLimit do
   try Log.Lines.Delete(0) except break end;
 IF Log.Lines.Count >= LinesLimit * 2 then Log.Lines.Clear; //Extra situation
end;

Procedure TfrmMain.StartServer;
Var Ini:TIniFile;
begin
 IF Server.Active then exit;
 Ini := TIniFile.Create(INIFNAME);
 try
   IF not Ini.ValueExists("SETTINGS", "PORT") then
     Ini.WriteInteger("SETTINGS", "PORT", cDefaultPort);
   IF not Ini.ValueExists("SETTINGS", "MAX_CONNECTIONS") then
     Ini.WriteInteger("SETTINGS", "MAX_CONNECTIONS", cMaxConnections);
   IF not Ini.ValueExists("SETTINGS", "WAIT_BEFORE_DISCONNECT") then
     Ini.WriteInteger("SETTINGS", "WAIT_BEFORE_DISCONNECT", cWaitBeforeDisconnect);
   IF not Ini.ValueExists("SETTINGS", "PING_INTERVAL") then
     Ini.WriteInteger("SETTINGS", "PING_INTERVAL", cPingInterval);
   IF not Ini.ValueExists("SETTINGS", "PINGED_LAST_ACTIVITY_VALUE") then
     Ini.WriteInteger("SETTINGS", "PINGED_LAST_ACTIVITY_VALUE", cPingedLastActivityValue);
   IF not Ini.ValueExists("SETTINGS", "AUTO_REGISTRATION_ENABLED") then
     Ini.WriteBool("SETTINGS", "AUTO_REGISTRATION_ENABLED", cAutoRegistrationEnabled);

   Server.Port := Ini.ReadInteger("SETTINGS", "PORT", cDefaultPort);
   MaxConnections := Ini.ReadInteger("SETTINGS", "MAX_CONNECTIONS", MaxConnections);
   WaitBeforeDisconnectValue := Ini.ReadInteger("SETTINGS", "WAIT_BEFORE_DISCONNECT", cWaitBeforeDisconnect);
   IF Ini.ReadInteger("SETTINGS", "PING_INTERVAL", cPingInterval) < 0 then
     PingInterval := 0
   else
     PingInterval := Ini.ReadInteger("SETTINGS", "PING_INTERVAL", cPingInterval);
   PingedLastActivityValue := Ini.ReadInteger("SETTINGS", "PINGED_LAST_ACTIVITY_VALUE", cPingedLastActivityValue);
   AutoRegistrationEnabled := Ini.ReadBool("SETTINGS", "AUTO_REGISTRATION_ENABLED", cAutoRegistrationEnabled);
 finally
   Ini.Free;
 end;
 AddLog("Starting server...");
 try
   Server.Open;
   ServiceThread.ResetVariables;
 except
   on E:Exception do AddLog("Error ""+E.Message+""");
 end;
 aStart.Enabled := not Server.Active;
 aStop.Enabled := Server.Active;
 LoadTrayIcon;
 IF Server.Active then
 begin
   gTotalInCount := 0; gTotalOutCount := 0;
   SetTitle("Active");
   CurrentLocalIP := GetLocalIP;
   AddLog("Server started. Local IP: "+CurrentLocalIP+". Port: "+IntToStr(Server.Port));
 end else AddLog("Server not started");
end;

вот теперь наверное хватит с первого


 
VID ©   (2004-09-01 10:04) [5]

теперь второй модуль

unit SocketThreadUnit;

interface

uses
 Classes, SysUtils, ScktComp, Windows, WinSock, SyncObjs;

type
 TSocketThread = class;
 TExecutePacketProc = procedure (SocketThread:TSocketThread);
 TSocketThread = class(TThread)
 private
   FRunExecutePacketProcAtFirstIteration:Boolean;
   FExecutePacketProc:TExecutePacketProc;
   FStringsLock:TCriticalSection;
   FSendTextLock:TRTLCriticalSection;
 public
   FSocket:TCustomWinSocket;
   FFirstIteration:Boolean;
   FStrings:TStringList;
   FSendingText:Boolean;
   Function Enter_CriticalSection(CriticalSection:TRTLCriticalSection):Boolean;
   Procedure Leave_CriticalSection(CriticalSection:TRTLCriticalSection);
   Function IsSocketConnected:Boolean;
   Function IsTerminated:Boolean;
   Function SendText(TargetSocketThread:TSocketThread; const Text:String; Attempts:Integer):Integer;
   Procedure AddReceivedText;
   constructor Create(CreateSuspensed:Boolean; ASocket:TCustomWinSocket;
     AExecutePacketProc:TExecutePacketProc;
     ARunExecutePacketProcAtFirstIteration:Boolean);
   destructor Destroy;override;
 protected
   procedure Execute; override;
 end;

 function WaitForData(Socket:TSocket; Timeout: Longint; IsWriteMode:Boolean): Boolean; forward;
 Function GetSocketThreadsCount:Integer;

implementation

Const SocketThreadsCleaningInterval = 300; //seconds

var SocketThreads:TList;
   SocketThreadsLock:TCriticalSection;
   LastSocketThreadsCleaningTime:Cardinal = 0;

Procedure ClearSocketThreadsFromDeadItems;
Var I:Integer;
begin
 For I:=SocketThreads.Count - 1 downto 0 do
   try
     IF TSocketThread(SocketThreads[I]).Terminated then
       SocketThreads.Delete(I);
   except
     SocketThreads.Delete(I);
   end;
end;

{ TSocketThread }

constructor TSocketThread.Create(CreateSuspensed:Boolean;
 ASocket:TCustomWinSocket; AExecutePacketProc:TExecutePacketProc;
 ARunExecutePacketProcAtFirstIteration:Boolean);
begin
 Inherited Create(CreateSuspensed);
 SocketThreadsLock.Enter;
 try
   IF GetTickCount - LastSocketThreadsCleaningTime >= SocketThreadsCleaningInterval * 1000 then
     try ClearSocketThreadsFromDeadItems except end;
   if SocketThreads.IndexOf(Self)<0 then SocketThreads.Add(Self);
 finally
   SocketThreadsLock.Leave;
 end;
 FStringsLock := TCriticalSection.Create;
 InitializeCriticalSection(FSendTextLock);
 FStrings := TStringList.Create;
 FreeOnTerminate := True;
 FSocket := ASocket;
 FExecutePacketProc := AExecutePacketProc;
 FRunExecutePacketProcAtFirstIteration := ARunExecutePacketProcAtFirstIteration;
 FSendingText:=False;
 FFirstIteration := True;
end;

destructor TSocketThread.Destroy;
begin
 try
   FStrings.Free;
   FStringsLock.Free;
   DeleteCriticalSection(FSendTextLock);
   SocketThreadsLock.Enter;
   try
     SocketThreads.Remove(Self);
   finally
     SocketThreadsLock.Leave;
   end;
 finally
   inherited Destroy
 end;
end;

Function TSocketThread.IsSocketConnected:Boolean;
begin
 try Result := FSocket.Connected except Result := False; end;
end;

Function TSocketThread.IsTerminated:Boolean;
begin
 try Result := Terminated except Result := True end;
end;

Function TSocketThread.SendText(TargetSocketThread:TSocketThread; const Text:String; Attempts:Integer):Integer;
Var SendSize, RemainSize, Attempt:Integer;
begin
 Result := 0; RemainSize := Length(Text);
 Attempt := 0; SendSize := -1;
 try
   if not Enter_CriticalSection(TargetSocketThread.FSendTextLock) then exit;
   TargetSocketThread.FSendingText := True;
 except exit end;
 try
   Repeat
     try
       With TargetSocketThread do //Нужно что бы не проходить код если потока уже нет
         if IsTerminated or (not IsSocketConnected) then exit;
     except exit end;
     IF WaitForData(TargetSocketThread.FSocket.SocketHandle, 1000, True) then
     begin
       Attempt := 0;
       IF Text <> "" then
       begin
         SendSize := TargetSocketThread.FSocket.SendBuf((@Text[Result+1])^, RemainSize);
         IF SendSize > 0 then
         begin
           IF SendSize < RemainSize then Sleep(1);
           Inc(Result, SendSize);
           Dec(RemainSize, SendSize);
         end else
           IF SendSize = 0 then Inc(Result, RemainSize)
           else //При неудачной попытке записи в буффер WinSock инкрементируем номер попытки
             IF SendSize = -1 then begin Inc(Attempt); Sleep(1) end;
       end else SendSize := 0;
     end else begin Inc(Attempt); Sleep(1) end;

     IF Attempts >-1 then
       IF Attempt >= Attempts then
       begin
         Result := -1; //Достигнуто макс. количество разрешённых неудачных попыток подряд
         Exit;
       end;

   Until (SendSize = 0) or Terminated or (not IsSocketConnected);
 finally
   try TargetSocketThread.FSendingText := False except end;
   try Leave_CriticalSection(TargetSocketThread.FSendTextLock) except end;
 end;
end;

Procedure TSocketThread.AddReceivedText;
begin
 FStringsLock.Enter;
 try
   FStrings.Add(FSocket.ReceiveText);
 finally
   FStringsLock.Leave;
 end;
end;

Function TSocketThread.Enter_CriticalSection(CriticalSection:TRTLCriticalSection):Boolean;
Var FirstIteration:Boolean;
begin
 FirstIteration := True;
 Repeat
   IF FirstIteration then FirstIteration := False else Sleep(1);
 Until (TryEnterCriticalSection(CriticalSection)) or Terminated
   or (not IsSocketConnected);
 Result := (not Terminated) and IsSocketConnected;
end;

Procedure TSocketThread.Leave_CriticalSection(CriticalSection:TRTLCriticalSection);
begin
 LeaveCriticalSection(CriticalSection);
end;


 
VID ©   (2004-09-01 10:05) [6]


procedure TSocketThread.Execute;
 Function GetFStringsCount:Integer;
 begin
   FStringsLock.Enter;
   try
     Result := FStrings.Count;
   finally
     FStringsLock.Leave;
   end;
 end;
begin
 While (not Terminated) and IsSocketConnected do
 begin
   IF FFirstIteration then
     try
       IF FRunExecutePacketProcAtFirstIteration and (Assigned(FExecutePacketProc)) then
         try FExecutePacketProc(Self) except end;
     finally
       FFirstIteration := False;
     end;

   Sleep(1);
   IF GetFStringsCount > 0 then
     repeat
       try
         if Assigned(FExecutePacketProc) then
           try FExecutePacketProc(Self) except end;
       finally
         FStringsLock.Enter;
         try
           FStrings.Delete(0);
         finally
           FStringsLock.Leave;
         end;
       end;
     until (GetFStringsCount = 0) or Terminated or (not IsSocketConnected);

   IF GetFStringsCount > 0 then
   begin
     FStringsLock.Enter;
     try
       FStrings.Clear;
     finally
       FStringsLock.Leave;
     end;
   end;
 end;
end;

{ end TSocketThread }

function WaitForData(Socket:TSocket; Timeout: Longint; IsWriteMode:Boolean): Boolean;
var
 FDSet: TFDSet;
 TimeVal: TTimeVal;
begin
 TimeVal.tv_sec := Timeout div 1000;
 TimeVal.tv_usec := (Timeout mod 1000) * 1000;
 FD_ZERO(FDSet);
 FD_SET(Socket, FDSet);
 IF IsWriteMode then
   Result := select(0, nil, @FDSet, nil, @TimeVal) > 0
 else Result := select(0, @FDSet, nil, nil, @TimeVal) > 0
end;

Function GetSocketThreadsCount:Integer;
begin
 Result := SocketThreads.Count;
end;

initialization
 SocketThreadsLock := TCriticalSection.Create;
 SocketThreads := TList.Create;
 LastSocketThreadsCleaningTime := GetTickCount;

finalization
 SocketThreads.Free;
 SocketThreadsLock.Free;

end.


всё...


 
Игорь Шевченко ©   (2004-09-01 10:07) [7]

Я бы придрался к
try .... except end;


 
stone ©   (2004-09-01 10:15) [8]


> давайте я здесь приведу исходники двух модулей моей последней
> программки

Дело в том, что часто вопрос о приглашении тебя на собеседование будет решать "девочка из отдела кадров", а ей твои исходники не нужны.


 
Ozone ©   (2004-09-01 10:16) [9]

Коментариев мало, ИМХО


 
КаПиБаРа ©   (2004-09-01 10:21) [10]

Игорь Шевченко ©   (01.09.04 10:07) [7]
Я бы придрался к
try .... except end;

К какому именно, их там 4?


 
peypivo ©   (2004-09-01 10:25) [11]

А что там не так с try..except ?


 
Ozone ©   (2004-09-01 10:26) [12]

К какому именно, их там 4?

:-) А я 15 насчитал...


 
WondeRu ©   (2004-09-01 10:33) [13]

ошибки:
1. опыт работы пишется в начале и расписывается чем занимался и в какие сроки, проекты, которые вел!
2. Вторым пунктом пишется образование
3. "Профессиональные навыки:" - смешал все! распиши по отдельным пунктам
4. не указывай версии продуктов
5. ActiveX, OLE замени на СОМ/DCOM-технологии
6. "Visual Basic for Applications(написание кода под приложения из пакета Microsoft Office)" и ежу понятно, пиши "VBA"
7. знание языков, водительские права - в отдельные пункты


 
WondeRu ©   (2004-09-01 10:37) [14]

поверь мне, твои исходники нафиг никому не нужны!) Это просто дурь! Ты не на олимпиаде по программированию.
Судят готовые проекты.


 
КаПиБаРа ©   (2004-09-01 10:38) [15]

stone ©   (01.09.04 10:15) [8]
Если принимают на путевую работу, то исходники посмотрят. На это и надо расчитывать. Конечно же и про резюме не забывать, что бы в случае с девочкой тоже шансы были.


 
Думкин ©   (2004-09-01 10:42) [16]

> [11] peypivo ©   (01.09.04 10:25)

Часть вписано для подавления каких-то проблем, это не обработка исключений, а их заглушка. Например:
try
  IF not SocketThread.FSendingText then
  begin
    Result := SendPacket(Packet, SocketThread.FSocket);
    IF Result>0 then Inc(gTotalOutCount, Result);
  end;
except end;


Взяли и задавили.


 
Layner ©   (2004-09-01 10:46) [17]

Исходники впечатляют. Только лучше бы выложил где нибудь в zip архиве проект. Как свою не бритую фотку :)


 
КаПиБаРа ©   (2004-09-01 11:00) [18]

Думкин ©   (01.09.04 10:42) [16]
Часть вписано для подавления каких-то проблем, это не обработка исключений, а их заглушка

Ну что в этом плохого. Мне например не нравится когда программа выдает кучу окон с SocetError если вытащить сетевой шнур. А в данном случае после проверки возвращаемого результата на 0 можно выдать аккуратное и не навязчивое сообщение о том что сообщение не было отправлено.


 
Dok_3D ©   (2004-09-01 11:04) [19]

Нормальное резюме. И исходники в норме. Рассылай работодателям и вперед на собеседование. Шансы, на мой взгляд, неплохие. На испытательный срок, конечно, 1000$ я бы не дал, но в будущем - в случае большой отдачи - очень вероятно.


 
peypivo ©   (2004-09-01 11:06) [20]

Все таки к [13] прислушайся. Открой в ворде мастер построения резюме.


 
VID ©   (2004-09-01 11:28) [21]

stone ©   (01.09.04 10:15) [8]
Да, конечно. Я это понимаю, но здесь просто встал вопрос о моей неопытности. При всём уважении к тебе, я не могу назвать себя неопытным, и поэтому я привёл здесь этот код. Ну и заодно хочется услышать конструктивной критики, ведь я только рад, если кто-то мне укажет "как не надо делать".
Ozone ©   (01.09.04 10:16) [9]
ну... это такое дело... я конечно понимаю что коменты должны занимать 30% общего текста, но я писал проект исключительно для себя, и не видел смысла в коментировании банальный процедур...
WondeRu ©   (01.09.04 10:33) [13]
Я уже говори. У меня есть подробное резюме в doc-формате, именно его я высылаю потенциальным работодалетям, а то, что я привёл здесь - есть моё резюме на job.ru а там, во-первых своя форма представления резюме, а во-вторых, значительные ограничения на объём резюме, и особо не распишешься...
В целом твои замечания 4,5,6 существенны. Исправлю. А вот про водительские права я говорить не буду - я ж не водилой для любовницы шефа устраиваюсь. А то ведь если следовать в таком духе то можно написать что яичницу готовить умею, Unreal Tournament и NFSU неплохо играю.... кому это нужно ?
Dok_3D ©   (01.09.04 11:04) [19]
Спасибо за поддержку. Такие слова мне нужны, для собственной уверенности...


 
stone ©   (2004-09-01 11:46) [22]


> но здесь просто встал вопрос о моей неопытности

Такой вопрос не вставал. Это взгляд с позиции "девочки из отдела кадров". Т.к. на собеседование тебя будет чаще всего приглашать именно она, и уже на втором этапе, после успешного интервью, ты будешь показывать свою квалификацию перед техническими специалистами. Есть и более прямой путь, но не стоит расчитывать только на него.

> Ну и заодно хочется услышать конструктивной критики, ведь
> я только рад, если кто-то мне укажет "как не надо делать".
>

http://www.rsdn.ru/summary/674.xml
http://www.rsdn.ru/Forum/Info.aspx?name=FAQ.resume


 
Mim1 ©   (2004-09-01 13:25) [23]

По коду:
мне кажется конструкторо вашего класса потока сделан некрасиво. Нужно было заменить конструктор и resume"ить его работу после инициализации его полей.
Глобальных переменных море, некоторые используются в приведенных отрезках (без роверки), но там же не создаются.

Хотя прилично, конструкции try ... filnally end используются верно. оперторов goto невидно, with не злоупотребляете.


 
VID ©   (2004-09-01 13:33) [24]


> Глобальных переменных море

Каждая глобальная переменная имеет свой глобальный смысл :)


> Нужно было заменить конструктор и resume"ить его
> работу после инициализации его полей.

А зачем ? Вдруг не хочет человек, что бы поток работал сразу после создания ? Класс TSocketThread я вообще то делал так что бы свободно использовать его в других проектах.

Вообще, это конечно всё мелочи... ньюансы конкретной реализации, так сказать...


 
Mim1 ©   (2004-09-01 16:52) [25]

Человек то захочет ,только что произойдет если он начнет работать до того как поля не инициализированы?  

constructor TSocketThread.Create(CreateSuspensed:Boolean;
ASocket:TCustomWinSocket; AExecutePacketProc:TExecutePacketProc;
ARunExecutePacketProcAtFirstIteration:Boolean);
begin
Inherited Create(CreateSuspensed); //  тут он начинает работать если в параметрах пришло true
// а дальше в вызывающем потоке идет инициализация
SocketThreadsLock.Enter;
try
  IF GetTickCount - LastSocketThreadsCleaningTime >= SocketThreadsCleaningInterval * 1000 then
    try ClearSocketThreadsFromDeadItems except end;
  if SocketThreads.IndexOf(Self)<0 then SocketThreads.Add(Self);
finally
  SocketThreadsLock.Leave;
end;
FStringsLock := TCriticalSection.Create;
InitializeCriticalSection(FSendTextLock);
FStrings := TStringList.Create;
FreeOnTerminate := True;
FSocket := ASocket;
FExecutePacketProc := AExecutePacketProc;
FRunExecutePacketProcAtFirstIteration := ARunExecutePacketProcAtFirstIteration;
FSendingText:=False;
FFirstIteration := True;
end;


Не лучше ли было?

constructor TSocketThread.Create(CreateSuspensed:Boolean;
ASocket:TCustomWinSocket; AExecutePacketProc:TExecutePacketProc;
ARunExecutePacketProcAtFirstIteration:Boolean);
begin
Inherited Create(true);
// а дальше в вызывающем потоке идет инициализация
 ...
if not CreateSuspensed then resulme;
end;


 
VID ©   (2004-09-01 18:55) [26]

нет, так не лучше.
вот проверь этот код.


type
 tmythread = class(tthread)
 fx1, fx2:integer;
 constructor Create(Susp:Boolean);
 protected
   procedure execute; override;
 end;

var
 thrd:tmythread;

constructor tmythread.Create(Susp:Boolean);
begin
 Inherited Create(susp); //(1)
 FX1 := 5;
 FX2 := 6;
end;

procedure tmythread.execute;
begin
 while not terminated do
   sleep(100);//(2)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 thrd := tmythread.Create(false);
end;



Расставь брейкпоинты на строке (1) и (2).
Нажми button1.

И пошагово (нажимая f8) отслеживай ход выполнения кодового потока.


 
nikkie ©   (2004-09-01 19:20) [27]

>И пошагово (нажимая f8) отслеживай ход выполнения кодового потока.
более убедительно было предложить заглянуть в исходники VCL.
и неплохо бы было бы задуматься, что реализация в другой версии может отличаться. сравниваем.

D6:
constructor TThread.Create(CreateSuspended: Boolean);
{$IFDEF LINUX}
var
 ErrCode: Integer;
{$ENDIF}
begin
 inherited Create;
 AddThread;
 FSuspended := CreateSuspended;
 FCreateSuspended := CreateSuspended;
{$IFDEF MSWINDOWS}
 FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID);
 if FHandle = 0 then
   raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(GetLastError)]);
{$ENDIF}
{$IFDEF LINUX}
 sem_init(FCreateSuspendedSem, False, 0);
 ErrCode := BeginThread(nil, @ThreadProc, Pointer(Self), FThreadID);
 if ErrCode <> 0 then
   raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(ErrCode)]);
{$ENDIF}

procedure TThread.AfterConstruction;
begin
 if not FCreateSuspended then
   Resume;
end;


D5:
constructor TThread.Create(CreateSuspended: Boolean);
var
 Flags: DWORD;
begin
 inherited Create;
 AddThread;
 FSuspended := CreateSuspended;
 Flags := 0;
 if CreateSuspended then Flags := CREATE_SUSPENDED;
 FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), Flags, FThreadID);
end;


 
paul_k ©   (2004-09-01 22:21) [28]

VID ©  
1. Ты ищешь работы в Москве, значит, то о чем я уже писал, - должен придти на собеседование когда пригласят
и при этом, крайне желательно принести с собой паспорт с гражданством России и свидетельство о регистрации.
Отсутствие этого сильно занижает твою стоимость и закрывает большую долю вакансий.
Я не говорю о том что я предлагал. Показал твое резюме шефу. ответ был:
- Не в Москве, из Дагестана, первое место в  Москве - на ...
  нам ещё его проблем с ментами не хватало

Для работодателя, потенциального, очень много значит когда ты в резюме кроме данных о том какой ты специалист указываеш адрес и телефон в том городе, где работу ищешь.


 
VID ©   (2004-09-01 22:35) [29]

Да я же ещё не в Москве! Вот приеду на квартиру, будет у меня  и адрес и телефон, сделаю себе прописку, хотя бы на три месяца...

блин, твоего шефа тоже можно понять :(( ну возможно мне попадётся работодатель, который будет менее разборчив и которому будет более необходим новый работник, чем твоему шефу...


 
VID ©   (2004-09-01 22:38) [30]

А вообще вся эта хрень с пропиской/регистрацией меня очень огрочает... И главное-то: мнения диаметрально противоположные!
Одни говорят, что при приёме на работу почти нигде не просят  регистрации (разве что если я стану материально ответственным лицом - тогда да..), другие что без регистрации не то что на работу - даже в туалет общественный не пустят!....

Да уж, настолько большой город, что в разных районах разные традиции...


 
VID ©   (2004-09-02 09:04) [31]

up, работодатели :)


 
Алхимик ©   (2004-09-02 09:11) [32]

Проверка регистрации работодателем - его личная инициатива.
По закону они не обязаны это делать.


 
data ©   (2004-09-02 09:27) [33]

VID ©   (01.09.04 22:38) [30]
По собственному опыту сделала такие выводы: требование о регистрации часто зависит от политики бухгалтерии и всей фирмы - если все работают вчерную, значит по барабану и регистрация. Если КЗОТ, белый оклад, и оформление по трудовой и как следует, то наверняка регистрация будет необходима. Есть и промежуточные
варианты. Смотри сам какие условия тебе подходят.
От себя скажу - черное оформление почти всегда подразумевает какие-то минусы, которые с первого взгляда может и не видны.


 
Sergey_Masloff   (2004-09-02 09:33) [34]

data ©   (02.09.04 09:27) [33]
>От себя скажу - черное оформление почти всегда подразумевает >какие-то минусы
Белое же всегда подразумевает как минимум один минус - я каждый месяц когда вижу сумму налогов которые с меня вычли - мне плохо становится.


 
data ©   (2004-09-02 09:49) [35]

>Sergey_Masloff   (02.09.04 09:33) [34]

можно не смотреть:)))
а если серьезно, то на самом деле работая в черную воруем не только у государства, а больше у себя: лишаемся пенсии, больничных, прав на кредиты и других законных прав. Зато работодатели чувствуют себя хозяевами ситуации: могут крутить с вашей черной зп как хотят: штрафы, задержки, невыплаты больничных и отпусков, снижая положение работников до рабского. Поэтому ИМХО можно считать, что та страшная сумма идет на оплату вашего достоинства, свобод и получение в случае необходимости хоть какой-то защиты от гос-ва по КЗОТУ, что на мой взгляд не маловажно.


 
Sergey_Masloff   (2004-09-02 10:00) [36]

data ©   (02.09.04 09:49) [35]
да я все понимаю ;-) это так...
Не всегда в конторах в которых платят "вчерную" все так мрачно. И руководители попадаются приличные люди и больничные с отпусками оплачиваются и вообще по-разному бывает.


 
paul_k ©   (2004-09-02 14:01) [37]

А ещё - наличие у тебя регистрации - это свидетельство для нанимателя о том, что свои жилищные проблемы ты решил и не будеш ими голову морочить...


 
data ©   (2004-09-02 14:18) [38]

>А ещё - наличие у тебя регистрации - это свидетельство для
>нанимателя о том, что свои жилищные проблемы ты решил

как раз таки нет. Чел. может быть зарегистрирован в одном месте (подставном для липовой регистрации, у родственников, знакомых), а жить в другом, и иметь те же жилищные проблемы, как у всех. Очень много таких зарегистрированных знаю.


 
Mim1 ©   (2004-09-02 18:37) [39]

Господа и что в здравом уме работодатель берет студента с регистрацией вмето опытного професионала без регистрации? Цирк какой то.


 
Sergey_Masloff   (2004-09-02 18:44) [40]

Mim1 ©   (02.09.04 18:37) [39]
Нет берет опытного профессионала с регистрацией.


 
VID ©   (2004-09-02 18:47) [41]

Sergey_Masloff   (02.09.04 18:44) [40]
оши на каждом шагу не валяются...


 
Mim1 ©   (2004-09-02 18:50) [42]


> [40] Sergey_Masloff   (02.09.04 18:44)

А нет у него соблазна взять профи без регистрации и платить ему меньше?


 
Sergey_Masloff   (2004-09-02 18:56) [43]

VID ©   (02.09.04 18:47) [41]
согласен. Но факты остаются фактами. Это не мое отношение  это факты.

Mim1 ©   (02.09.04 18:50) [42]
>А нет у него соблазна взять профи без регистрации и платить ему >меньше?
Нет. Если это нормальный профи то его зарплата это ничтожные суммы по сравнению с отдачей от него (и с потерями которые могут возникнуть в случае возникновения проблем прямо или косвенно связаных с отсутствием регистрации - ну кончился срок аренды квартиры надо новую искать и он целыми днями сидит на телефоне а не работает. Например.). Я не хочу сказать что наличие регистрации от таких проблем спасает. Нет. Но мнение кадровых служб несколько иное.


 
paul_k ©   (2004-09-03 10:40) [44]

Mim1 ©   (02.09.04 18:50) [42]
А смысл?
поработав пару месяцев он становится опытним и с регистрацией, и скалывает в другое место


 
Mim1 ©   (2004-09-03 17:48) [45]


> А смысл?
> поработав пару месяцев он становится опытним и с регистрацией,
> и скалывает в другое место


Думается через пару месяцев можно ему ЗП поднять, и никуда он не уйдет.

PS вы не подумайте что я себя представляю в качестве этого гипотетического наботника. Я конечно мечтаю перебраться в москву, но надо набраться опыта и решить чтото с образованием. Так что пока не очень спешу.



Страницы: 1 2 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.64 MB
Время: 0.038 c
4-1092439003
SSSSS
2004-08-14 03:16
2004.09.26
Как на API переводить строки в Float и наоборот? Это возможно?


14-1094562277
Holy
2004-09-07 17:04
2004.09.26
Сколько бы россиян так сделало?


1-1095086370
Lord de Mon
2004-09-13 18:39
2004.09.26
ShellExecute


1-1094400230
Ok
2004-09-05 20:03
2004.09.26
Как узнать координаты курсора мыши в KOL ???


1-1094647438
Garfunkel
2004-09-08 16:43
2004.09.26
Распределение строк по captions





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский