Q&A

  • 서버소켓에서의 쓰레드 사용법
안녕들 하십니까?

질문--------->>>

저는 지금 ars 개발중인데...

설명)

ars에서 90회선(최악의상황)에서 동시에 조회가 들어오면 query를 해서 해당 데이타를

보내줘야 하는데 이것이 지연이 될지???? 얼마나 될지???? 이것이 궁금하구요...

그리고 각 패킷의 해당데이타를 보내줄때 쓰레드를 사용하면 속도를 줄일수 있나요?

그리고 쓰레드를 사용하려면 어떻게 해야 할지????

토요일이 오픈예정(0600-3300)인데 마지막에 이런 곤란한 상황이 발생해서 난처합니다.

그리고 저는 쓰레드를 잘 사용하지 못해서 그러는데 자세한 설명이 있었으면 합니다.

오픈하면 한번씩 들러보세요...

정말 급하거든요...

고수님들의 조언을 눈빠지게 기다립니다.

안녕히 계십시요....



1  COMMENTS
  • Profile
    이상호 2000.04.13 10:27
    안녕하세요. 늦은 밤 일하시느라 고생이 많으시군요.



    클라이언트가 조회를 하기위해 서버로 임의의 형식으로 데이터를 전송하면

    서버 소켓에서는 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)인데 마지막에 이런 곤란한 상황이 발생해서 난처합니다.

    > 그리고 저는 쓰레드를 잘 사용하지 못해서 그러는데 자세한 설명이 있었으면 합니다.

    > 오픈하면 한번씩 들러보세요...

    > 정말 급하거든요...

    > 고수님들의 조언을 눈빠지게 기다립니다.

    > 안녕히 계십시요....

    >