Текущий архив: 2004.09.26;
Скачать: CL | DM;
ВнизИщу работу в Москве. Найти похожие ветки
← →
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]
Нет берет опытного профессионала с регистрацией.
Страницы: 1 2 вся ветка
Текущий архив: 2004.09.26;
Скачать: CL | DM;
Память: 0.62 MB
Время: 0.057 c