안녕들 하십니까?
질문--------->>>
저는 지금 ars 개발중인데...
설명)
ars에서 90회선(최악의상황)에서 동시에 조회가 들어오면 query를 해서 해당 데이타를
보내줘야 하는데 이것이 지연이 될지???? 얼마나 될지???? 이것이 궁금하구요...
그리고 각 패킷의 해당데이타를 보내줄때 쓰레드를 사용하면 속도를 줄일수 있나요?
그리고 쓰레드를 사용하려면 어떻게 해야 할지????
토요일이 오픈예정(0600-3300)인데 마지막에 이런 곤란한 상황이 발생해서 난처합니다.
그리고 저는 쓰레드를 잘 사용하지 못해서 그러는데 자세한 설명이 있었으면 합니다.
오픈하면 한번씩 들러보세요...
정말 급하거든요...
고수님들의 조언을 눈빠지게 기다립니다.
안녕히 계십시요....
클라이언트가 조회를 하기위해 서버로 임의의 형식으로 데이터를 전송하면
서버 소켓에서는 OnClientRead 이벤트가 발생할 것입니다. 그러면 서버쪽에서
그 질의에 응답할 수 있는 쓰레드를 구동시키면 되겠죠. 그리고, 델파이에서
쓰레드에 대한 도움말을 보면 16개를 초과하는 쓰레드는 발생시키지 않는 것
이 좋다는 권고문이 있습니다. 하지만 쿼리는 언제든지 들어올 수 있다고
가정을 해야 하기 때문에 클라이언트로부터의 모든 질의를 처리하기 위해서는
조금 더 복잡한 과정을 거쳐야 할 것 같습니다.
제가 제안하는 방법은 우선 큐를 하나 만들어둡니다.
그 다음은 큐에 저장된 데이터의 갯수를 항상 관찰하는 A라는 쓰레드를 하나
두는 것입니다. 그리고 클라이언트에 응답하기 위한 B라는 쓰레드를 하나
둡니다. B는 가능한 갯수내에서 A에 의해서 생성될 수 있도록 합니다.
서버 소켓에 질의가 들어오면 무조건 큐에 push하고, A는 큐를 항상 관찰하고
있다가 처리할 작업이 있으면 B를 생성시키는 것입니다.
아래의 코드를 보세요. 테스트하지는 않은 것이고 다만 참조용입니다.
type
// 쿼리를 저장하기 위한 큐입니다. 큐의 메쏘드는 구현하지 않았습니다.
TQryQueue = class(TObject)
private
qry: array [0..99] of String;
pos: Integer;
cnt: Integer; // 저장된 데이터의 갯수
public
function GetElementCount: Integer;
procedure Push(str: String);
function Pop: String;
end;
// 먼저 A 쓰레드입니다.
TThreadA = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
// 그 다음 B 쓰레드입니다.
TThreadB = class(TThread)
private
{ Private declarations }
QryStr: String;
protected
procedure Execute; override;
public
constructor Create(qStr: String);
end;
// 생성된 B 쓰레드 갯수를 참조하는 전역변수와 큐 객체
var
CountB: Integer;
MyQ: TQryQueue;
LockServer: Boolean;
implementation
procedure TThreadA.Execute;
var
tB: TThreadB;
s: String;
begin
while not Terminated do
begin
if CountB <= 15 then // 생성가능한 B 쓰레드의 갯수제한
begin
if MyQ.GetElementCount > 0 then // 큐에 처리할 데이터가 있으면
begin
s := MyQ.Pop; // 큐에서 처리할 질의문을 꺼낸다.
tB := TThreadB.Create(s);
tB.Resume; // 쓰레드 실행
end;
end;
end;
end;
constructor TThreadB.Create(qStr: String);
begin
inherited;
qryStr := qStr;
FreeOnTerminate := True;
end;
procedure TThreadB.Execute;
var
qry:TQuery;
res: String;
begin
while not Terminated do
begin
// 다른 B 쓰레드가 ServerSocket을 사용하지 않을 때...
if LockServer = False then
begin
LockServer := True;
// 아래의 쿼리 및 Socket의 SendText가
// 정상적으로 실행되지 않으면 Synchronized()를 사용해야 한다.
qry := TQuery.Create(Application);
qry.DatabaseName := DataModule1.Databse1;
qry.SQL.Add(qry);
// DB에 쿼리해서 클라이언트에 돌려줄 데이터를 가져온다.
qry.Open;
res := qry.FieldByName('AAA').AsString;
qry.Close;
qry.Free;
// 클라이언트에 응답
ServerSocket1.SendText(res);
// Lock된 서버를 해제
LockServer := False;
end;
end;
end;
// 큐 생성 및 큐를 관찰하는 쓰레드 시작
procedure TFormMain.FormCreate(Sender: TObject);
var
tA: TThreadA;
begin
MyQ := TQryQueue.Create;
MyQ.Cnt := 0;
MyQ.Pos := 0;
tA := TThreadA.Create(False);
end;
// 서버에 질의가 들어오면 무조건 큐에 저장
procedure TFormMain.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
qryStr: String;
begin
qryStr := Socket.ReceiveText;
MyQ.Push(qryStr);
end;
제가 소켓과 쓰레드를 사용한 통신 프로그램을 만들어 본 경험으로
작성한 글입니다. 대답이 충분하지 않으면 메일 주세요.
황원석 wrote:
> 안녕들 하십니까?
> 질문--------->>>
> 저는 지금 ars 개발중인데...
> 설명)
> ars에서 90회선(최악의상황)에서 동시에 조회가 들어오면 query를 해서 해당 데이타를
> 보내줘야 하는데 이것이 지연이 될지???? 얼마나 될지???? 이것이 궁금하구요...
> 그리고 각 패킷의 해당데이타를 보내줄때 쓰레드를 사용하면 속도를 줄일수 있나요?
> 그리고 쓰레드를 사용하려면 어떻게 해야 할지????
> 토요일이 오픈예정(0600-3300)인데 마지막에 이런 곤란한 상황이 발생해서 난처합니다.
> 그리고 저는 쓰레드를 잘 사용하지 못해서 그러는데 자세한 설명이 있었으면 합니다.
> 오픈하면 한번씩 들러보세요...
> 정말 급하거든요...
> 고수님들의 조언을 눈빠지게 기다립니다.
> 안녕히 계십시요....
>