ISAPI로 개발시에 특정 리소스에 LOCK을 걸고 해재하고
이런 형태로 프로그래밍을 할려고 합니다..
다시 말하면 Critical Section을 사용해서 ISAPI DLL코드를
직렬화(동기화) 시키고 싶다는 이야기지요.
쩝..근데..TcriticalSection이라는 놈을 ISAPI DLL코드안에서
create하고 lock을 걸고 풀고 이런형태로 코딩을 했는데도
불구하고 제대로 동기화가 되지 않는것 같습니다..
제가 무엇을 잘못하고 있는건지..??
코드는 다음과 같습니다..
고수님 /. 좀 봐주시고..잘못된 부분이나 제가 잘못알고 있는 부분 있으면
지적좀 부탁합니다..
procedure TWebModule1.WebModule1CountAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
Lock: TCriticalSection;
F: TextFile;
Content, Buf, Filename: string;
seq: integer;
begin
Lock := nil;
Filename := Getpath;
if ( Filename[Length(filename)] <> '' ) then Filename := Filename + '';
Filename := FileName + 'seq.txt';
Lock := TCriticalSection.Create;
Lock.Enter;
{ Sequence Write }
if ( not FileExists(FileName) ) then
Begin
Try
AssignFile(F,Filename);
Rewrite(F);
Writeln(F, '1');
Finally
CloseFile(F);
end;
end
else
Begin
Try
AssignFile(F, FileName);
Reset(F);
ReadLn(F, Buf);
Finally
CloseFile(F);
end;
Seq := StrtointDef(buf, 1);
buf := inttostr(seq + 1);
Try
AssignFile(F, FileName);
ReWrite(F);
WriteLn(F, Buf);
Finally
CloseFile(F);
end;
end;
Lock.Leave;
Lock.Free;
Response.content := 'ok';
Response.SendResponse;
end;
가장 큰 실수는요
Lock: TCriticalSection; 요 부분이 전역으로 선언되어야 한다는 거죠...쩝
이상 끝....포항에서 송인표
송기원 wrote:
> ISAPI로 개발시에 특정 리소스에 LOCK을 걸고 해재하고
> 이런 형태로 프로그래밍을 할려고 합니다..
> 다시 말하면 Critical Section을 사용해서 ISAPI DLL코드를
> 직렬화(동기화) 시키고 싶다는 이야기지요.
>
> 쩝..근데..TcriticalSection이라는 놈을 ISAPI DLL코드안에서
> create하고 lock을 걸고 풀고 이런형태로 코딩을 했는데도
> 불구하고 제대로 동기화가 되지 않는것 같습니다..
> 제가 무엇을 잘못하고 있는건지..??
>
> 코드는 다음과 같습니다..
> 고수님 /. 좀 봐주시고..잘못된 부분이나 제가 잘못알고 있는 부분 있으면
> 지적좀 부탁합니다..
>
>
> procedure TWebModule1.WebModule1CountAction(Sender: TObject;
> Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
> var
> Lock: TCriticalSection;
> F: TextFile;
> Content, Buf, Filename: string;
> seq: integer;
> begin
>
> Lock := nil;
>
> Filename := Getpath;
> if ( Filename[Length(filename)] <> '' ) then Filename := Filename + '';
> Filename := FileName + 'seq.txt';
>
> Lock := TCriticalSection.Create;
> Lock.Enter;
> { Sequence Write }
> if ( not FileExists(FileName) ) then
> Begin
> Try
> AssignFile(F,Filename);
> Rewrite(F);
> Writeln(F, '1');
> Finally
> CloseFile(F);
> end;
> end
> else
> Begin
> Try
> AssignFile(F, FileName);
> Reset(F);
> ReadLn(F, Buf);
> Finally
> CloseFile(F);
> end;
> Seq := StrtointDef(buf, 1);
> buf := inttostr(seq + 1);
> Try
> AssignFile(F, FileName);
> ReWrite(F);
> WriteLn(F, Buf);
> Finally
> CloseFile(F);
> end;
> end;
>
> Lock.Leave;
> Lock.Free;
> Response.content := 'ok';
> Response.SendResponse;
> end;
>