Q&A

  • indy 에서 무한 Thread 생성시 Error
안녕하세요.

Client 의 Thread에서 Data(Stream)를 Acquisition하여 indy를 통해
획득한 Data(Stream)를 생성된 Thread를 통해 Server로 전송하고 있습니다.

1. Acquisition Thread
2. Send Thread

2번째 Send Thread는 데이터를 전송할때 쓰이며, Data를 전송한후 종료 됩니다.
이렇게 무한히 돌리면 대략 1분 정도 후에 Thread Create 하는 부분에 걸리면서
아래의 Error 메세지가 뜹니다.

'Thread Creation Error : 사용가능한 저장소가 부족하여 해당 이 명령을 처리할수 없습니다.'

Thread 생성하는 부분입니다.
<!--CodeS-->
    WThread := TWriteThread.Create(IdTCPClient1, TRecord);
    WThread.FreeOnTerminate := True;
    WThread.Resume;
<!--CodeE-->

Thread 수행/종료하는 부분입니다.
<!--CodeS-->
procedure TWriteThread.Execute;
begin
  { Place thread code here }

    While not Terminated do
    Try
        if not WThreadSock.Connected then
        begin
            WThread.Suspend;
            WThread.Terminate;
        end;

        WThreadSock.WriteBuffer(SendRecord, Sizeof(SendRecord), true);

        WThread.Suspend;
        WThread.Terminate;

    Except on E: Exception do
        begin
            if WThreadSock.Connected then
                WThreadSock.Disconnect;
            Terminate;
        end;
    end;

end;
<!--CodeE-->

매번 Thread가 제대로 종료 안되서 위와 같은 메세지가 나오는건가요?
관련해서 경험해보신 분 계시면 답변 부탁 드립니다.

그리고, 이와 같이 매번 2번째 Thread를 생성/수행/종료를 안하고,
한번만 생성하여 계속 수행하다가 모든 전송이 끝나면 종료 하는 방법은 없는가요?

좋은 하루보내세요~

3  COMMENTS
  • Profile
    이중철 2005.03.08 19:26
    굳이 송신부 스레드가 존재할 이유가 있나요?
    그냥 과감히 없애세요 그리고 수집부에 걍 송신하세요.
    만약 송신측 대역폭에 여유가 없으면 어차피 스레드 여러개 돌려도 마찬가지입니다.
    그리고 수집부에서 데이타가 지속적으로 받아지며 송신과 연계해서는 안된다고
    생각되신다면 다음과 같이 하십시요
    먼저 수집부에서 데이타를 수신한 후 큐에 쌓고 메세지 발생시켜서 순차적으로
    송신해도 됩니다.(일반적으로 전 이렇게 함) 송신시 인디에서 스레드로 송신하니
    걱정하시지 말고요(Anti... 컴퍼넌트 이름 까먹었음 하여간 그거 같이 사용해서..)


  • Profile
    이재근 2005.03.10 00:40
    안녕하세요. 우선 답변 감사드립니다.

    제가 이해가 잘 안가서 다시 한번 질문을 드리겠습니다.

    데이터를 받는 쓰레드 에서 데이터가 획득 되어지면.. 그 데이터를 전송하라고
    Send Thread를 만듭니다. 데이터가 전송이 되면 Send 완료 flag를 true 하고 Terminate 시킵니다.
    그리고, 데이터를 받는 쓰레드에서 데이터가 획득되어지고 다시 Send Thread가 만들어지고 전송되고 ..
    이렇게 Send Thread를 획득 되어지는 수만큼 만들어서 데이터를 보내다가 보면,
    아래와 같은 메세지가 띄워 집니다. (대략 2000개 정도의 Thread 생성되고 종료 된정도..)

    'Thread Creation Error : 사용가능한 저장소가 부족하여 해당 이 명령을 처리할수 없습니다.'

    그래서, 제 생각은 Thread가 제대로 종료 되지 않아서 생기는 것일까에 대한 생각이 든 것입니다.
    작업 관리자를 띄워보면.. 메모리가 증가되고 있구요.
    이런 경우 Thread 생성과 종료가 제대로 되어진것인지? (아래 code 상)

    그리고, Send쪽 Thread는 여러개를 돌리는 것이 아니라..
    한개의 Thread를 순차적으로 생성/종료를 반복 하는 것입니다.

    Thread 생성과 종료와 관련하여 위와 관련한 Error에 대한 원인을 찾고 있습니다.
    다시 한번 답변을 부탁드리겠습니다.
    감사합니다.


  • Profile
    이재근 2005.03.14 21:13
    안녕하세요.
    결국 Thread가 제대로 종료 되지 않아서 생긴 문제 였습니다.

    Thread Execute 하는 부분에 있던 m_bSendFlag를
    OnTerminate 되는 부분에 넣어서 해결 하였습니다.
    (m_bSendFlag는 Acquisition Thread에서 쓰이는 Flag로 데이터를 전송 시키는 Flag로,
    Send Thread를 생성하고 수행시키는 역할을 합니다.)
    <!--CodeS-->
        WThread := TWriteThread.Create(IdTCPClient1, TRecord);
        WThread.OnTerminate := ThreadDone;
        WThread.Resume;

    procedure Tfrm_Client.ThreadDone(Sender: TObject);
    begin
        m_bSentFlag := True;
    end;
    <!--CodeE-->

    위와 같이 하니깐. 메모리 Leak도 없어지고,
    'Thread Creation Error : 사용가능한 저장소가 부족하여 해당 이 명령을 처리할수 없습니다.'
    에러도 나타나지 않았습니다.

    좋은 하루보내세요.


    • 라벤더
      2005.03.10 00:30
      FileRead(FH, PChar(nfile), len); 이런식으로 쓰면 되지 않나요.. 무엇이 문제이신지;;
    • 세일러문
      2005.03.10 00:42
    • 오석영
    • 2005.03.09 10:15
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 강인규
      2005.03.09 23:41
      코드를 정리해서 올려주셔서 어떤식으로 쓰시는지는 잘 모르겠습니다만은 요런 경우 시간이 걸리는 부...
    • 손희석
      2005.03.09 22:04
      배열보다는 TList형을 이용하는 것이 나을지도요.. 메모리 누수가 걱정되시면 TObjectList를 이용하시면...
    • 난 백만당적이다.
      2005.03.09 19:54
      for문을 이용해서 n만큼 반복해서 하면 되지 않나요? <!--CodeS--> for i := 0 to n do be...
    • 홍성락
      2005.03.09 05:41
      그냥 쉽게 전역변수써서 마우스다운/업에 코딩 하시면 안되나요, 아래 perform으로 윈도우메세지 써야하나...
    • nilriri™
      2005.03.09 02:05
      .
    • 이창재
    • 2005.03.09 01:18
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 박지용
      2005.03.09 01:22
      Delete 나 Update를 할 때 즉, 결과 recordset을 받지 않는 경우는 ExecSQL(); 로 쿼리를 실행해야 합니다...
    • 이창재
      2005.03.09 01:25
    • 박준하
    • 2005.03.09 01:15
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 모영철
      2005.03.08 23:00
      배열은 지역이냐 전역이냐에 따라 생성 소멸되기 땜에 프로그램이 종료 되면 메모리 해제 될테구요.. ...
    • 최성효
    • 2005.03.08 20:48
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 박지용
      2005.03.09 01:25
      BDE를 이용하지 말고, ADODB 컴포넌트를 사용하면 더좋은 결과를 얻을꺼에요^^
    • 최성효
      2005.03.09 03:17
      답변 감사합니다. 그런데 MSSQL 2000 이랑 delphi 7.0 이랑 연결하는 자료는 쉽사리 찾아지지가 않네요~...
    • 박지용
      2005.03.09 23:27
      여기 자료실이나, 강좌에서 ADO관련자료를 찾아보시거나, 델파이 관련 책을 구매하시면 ADO관련내용은 ...
    • 장재영
    • 2005.03.08 17:26
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 난 백만당적이다.
      2005.03.08 18:11
      년도가 뒤로간 날짜 타입이 존재하잖아요... 12-31-2005   머 이런식으로.... ...
    • 장재영
      2005.03.16 16:55
      config.db 에 command=set DATE ANSI 위 환경 때문에   2005-12-31 이런 형식으로 자동 변...
    • 이영주
    • 2005.03.08 10:52
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 유효근
    • 2005.03.08 07:37
    • 1 COMMENTS
    • /
    • 0 LIKES
    • nilriri™
      2005.03.08 18:24
      레지스트리 항목이 뜻하는 건 알수 없지만.. 추측컨데 익스플로러 종료시에 열어본 페이지 목록을 지우...
    • 권수광
    • 2005.03.08 06:53
    • 3 COMMENTS
    • /
    • 0 LIKES
    • nilriri™
      2005.03.08 18:28
      세션 정보가 필요한 이유가 뭔지 여쭤봐도 될까요?
    • 권수광
      2005.03.09 06:40
      세션 정보가 필요한 이유는 그 웹에 로그인 한 사용자에 따라 메뉴 사용에 제한을 둘려고 합니다. 그러...
    • nilriri™
      2005.03.09 21:44
      제가 잘못이해하고 있는건가요? 세션이란건 서버측에 가지고 있는 데이터.. 쿠키는 클라이언트측에 ...
    • 이정택
    • 2005.03.08 05:29
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 강재규
      2005.03.08 20:54
      저의 생각으로는 ClientWidth = 100% ClientHeight = 100% 으로 해보세요. win98나 win2000에서 작...
    • 이재근
    • 2005.03.08 00:39
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 이중철
      2005.03.08 19:26
      굳이 송신부 스레드가 존재할 이유가 있나요? 그냥 과감히 없애세요 그리고 수집부에 걍 송신하세요. 만...
    • 이재근
      2005.03.10 00:40
      안녕하세요. 우선 답변 감사드립니다. 제가 이해가 잘 안가서 다시 한번 질문을 드리겠습니다. 데이...
    • 이재근
      2005.03.14 21:13
      안녕하세요. 결국 Thread가 제대로 종료 되지 않아서 생긴 문제 였습니다. Thread Execute 하는 부분에...
    • 로도스
    • 2005.03.08 00:24
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 난 백만당적이다.
      2005.03.09 00:38
      이런 방법도 있습니다. <!--CodeS--> var    i : Integer;    ch...
    • 정정호
      2005.03.08 01:39
      function ReverseWideString(const AText: WideString): Widestring; var   I, Index: Integer...
    • nilriri™
      2005.03.08 00:59
      한글 또는 ByteType 로 검색해서 참고하세요..^^ <!--CodeS--> // 참고만 하세요...ㅡㅡ; ...
    • 성지현
    • 2005.03.08 00:15
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2005.03.08 01:00
      안녕하세요. 최용일입니다. 시작메뉴의 델파이아이콘에서 마우스 오른쪽 클릭해서 맨밑에 속성메뉴 클릭...
    • 성지현
      2005.03.08 19:05
      아이고 감솨함당~~
    • 고진중
    • 2005.03.07 21:45
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 무심코
      2005.03.07 21:50
      OnCloseQuery 이벤트에서 하시고요 CanClose 를 true/false 값을 주시면 됩니다.
    • 오병준
    • 2005.03.07 19:22
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 도깨비
      2005.03.23 21:31
      socket open 후 바로 처리로직을 넣으시면 안되고, onConnected 이벤트 발생시 실제 connect된 것이므...