Q&A

  • rs232c통신에서요..
comport를 데이터를 받는데 상당한 량이 계속해서 들어옵니다.
어세스바이오레이션 하고 쓰레드를 더이상 저장할 공간이 없다고 나오네요.
초기화를 해야할텐데..
comport부분을 연결하자마자 에러가 떨어지기가 무섭네요. (어세스바이오레이션)

그리고 쓰레드를 한번만 create해서 해당 업무를 쓰레드내에서 호출하는 법이나
혹은 쓰레드를 초기화하는 방법은 무엇이 잇을까요.
받을때마다 thread 를 create해서 그런듯 싶은데..
하나 생성하면 바로 해당 쓰레드내부에서 터미네이트시켜도 마찬가지로 그렇습니다. (조금 지나면 쓰레드를 더이상 저장할 공간이 없다고.. )

그리고 받는 쪽에서 어세스바이오레이션이 뜨는데.. 데이타가 너무 빨리 엄청 많이 나와서 그런듯 싶은데
그대로 받음서 처리할수있는 방법은 없는지... 프로토콜 손않돼고..
초기화 하는 방법을 모르겟습니다. 받은 파라미터(스트링형)에 대한 값은 초기화했는데..
comm1.readbufferfree 를 사용해도 소용이 없네요.. 조언부탁드릴께요.


참고로 comport componant는 tma async를 사용했구요 (Comport 콤퍼넌트만 (buffer는 사용않햇습니다.) 쓰레드를 생성해서 처리하도록 햇습니다.

고수님들의 조언부탁드립니다.

4  COMMENTS
  • Profile
    이승민 2005.06.08 18:16
    음 rs232c 를 사용할때 여러가지 방법들을 사용하는데 그중 제가 쓰는 방법은 comport 당 하나의 Timer 나 Thread 를 만들어서 계속 read 하는 것입니다.
    물론 데이데가 없으면 처리를 안하면 되겠죠
    우선 Timer 나 Thread 를 생셩한 후 Comport 를 열어 들어오는 데이터를 저장하면 어떨지..
    rs232c 로 들어오는데이데가 많다고 하지만 실지로 들어오는 데이터를 처리하는 부분이 시간이 걸릴뿐이지 다른곳에 저장하는 것은 시간이 거의 걸리지 않습니다.
    질문하신 내용에 답이 되었는지 모르겠습니다.
    그럼 즐프되세요

  • Profile
    프란시스 2005.06.08 22:49
    쓰레드를 하나  발생(create) 시켜서 지속적으로 read하도록 하는 방법은 어떤것인지요? 부탁드립니다.

  • Profile
    한만교 2005.06.09 03:14
    제가 하는 일반적인 그러나 정석(반드시 정석이라 할 순 없지만..ㅎㅎ)이라 할수 있는 방법입니다..

    쓰레드을 이용하여 시리얼 통신으로 데이터를 읽어온것을 분석합니다.
    또한 아래 사용한 ReadList는 통신으로 데이터를 읽어오면 저장하는 것이지요..
    일반적으로 이렇게 사용하지만 큐를 사용하기도 하고 걍 스트링으로 문자열을 하나 만들어서 쓰기도 합니다.
    하지만 데이터가 많아지거나 읽을 데이터가 길어진다면 문자열로 선언해서 읽은 데이터를 분석하기란 거의 힘들다고 봐여..그래서 전 큐를 만들어서 사용하지만 여기선 스트링 리스트를 사용하도록 하겠습니다..
    전반적인 루틴은 아래와 같습니다..
    그럼 이만..

    unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

    type
      TReadThread = class(TThread)
      protected
        procedure Execute; override;
      end;

      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
        FReadThread : TReadThread;
        ReadList : TStrings;
        procedure Run_();
      public
        { Public declarations }
        Run : Boolean;
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.DFM}


    procedure TReadThread.Execute;
    begin
      while Form1.Run do
      begin
        sleep(10); // 메인 프로세서의 원활한 동작을 위해 선언
        Form1.Run_();
      end;
    end;

    procedure TForm1.Run_(); // 쓰레드에서 실행할 함수.
    var
      ReadData : string;
    begin
      if ReadList.Count = 0 then Exit;


      ReadData := '';
      ReadData := ReadList.Strings[0];
      // 분석하고..........
      {
      .
      .
      .
      .
      .
      }
      // 분석이 끝나면..........
      ReadList.Delete(0);
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ReadList := TStringList.Create;    // 읽어온 데이터를 저장할 버퍼

      Run := True; // 쓰레드 동작조건
      FReadThread := TReadThread.Create(True); // 쓰레드 생성
      FReadThread.Resume; // 쓰레드 동작 시작
    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      FreadThread.Suspend; // 쓰레드 멈춤
      FreadThread.Terminate; // 쓰레드 죽임.
      ReadList.Free;
    end;


    procedure TForm1.Rx~~~~~... // 이것은 사용하고 계신 통신용 VCL에서 리시브에 대한 이벤트 소스
    begin
      RcvData // 사용중인 VCL의 읽은 데이터 버퍼
      ReadList.Add(RcvData); // 읽은 데이터를 스트링 리스트에 계속 추가를 하면
                                            // 쓰레드에선 그 스트링 리스트에서 읽어서 분석부분에서 처리하고
                                            // 처리하는 족족 지워준다..
                                            // 지워주면 읽은 데이터가 없으면 쓰레드는 자연적으로 쉬겠지요..ㅎㅎ
    end;

    end.


    뭐 대충 이렇게 설명을 했습니다만
    통신으라함은 말그대로 통하는 것이지요..따라서 약속된 규약이 있습니다..그 약속을 따라주는게 좋지요..
    그럼 궁금하신 사항은 멜로 주십시요..
    ㅎㅎ
  • Profile
    프란시스 2005.06.09 22:53
    전 일단 급해서 그냥 thread를 생성해서 바로 free시키는 방법으로 그냥 진행했습니다. 별문제없이 잘 처리 되는듯 싶습니다
    그리고 답변내용 궁금했던 사항이였는데 답변 참 감사합니다 참고하고 잘 사용하겠습니다.

    • 도끼로이마까
      2005.06.10 20:58
      질문의 의도가,,,C함수를 델파이로 고치는건가여,, 아니면,,C함수가 dll형태로 되어있는데,,이것을 델파...
    • nilriri™
      2005.06.10 07:20
      다를게 없는데...왜그런지 모르겠네요..ㅡㅡ; ADO인가요? BDE인가요?
    • 크로이첼
      2005.06.11 02:35
      역시 안대니 별의 수를 다 동원하네요. 걍 프로시져에서 나오는 결과값을 임시테이블만들어서 거기다 값 ...
    • 백승석
    • 2005.06.09 20:32
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 도끼로이마까
      2005.06.10 21:07
      Label이나 ProgressBar에 프로퍼티를 설정하신후, Repaint를 호출해주시면 됩니다.. Repaint는 WinCont...
    • 송 시중
      2005.06.09 22:35
      작업을 쓰레드화 시켜서 우선순위를 낮추거나, 화면과 동기화 한다던지 루프안에 Form.ProcessMessage...
    • 남충희
      2005.06.12 05:17
      다른 방법도 있겠지만 FTP의 경우 WinINet의 콜백함수에서 ProcessBar를 나타내는것이 일반적입니다. 그리...
    • 전상현
    • 2005.06.09 16:56
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 석주현
      2005.06.09 18:19
      Help 에 이렇게 나와 있네요. Note:        Dotted or dash...
    • 송 시중
    • 2005.06.09 09:24
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 천희택
      2005.07.02 09:02
      저도 초보라 도움이 될지 모르겠습니다.. 4가지 방법이 있는데 CriticalSection, Mutex, Semaphore, ev...
    • 도끼로이마까
      2005.06.10 21:11
      님께서 말씀하시는 synchronize는 님구현하려는 내용과 전혀 상관없습니다.. 델파이 Thread의 synchroni...
    • 허학송
    • 2005.06.09 05:59
    • 2 COMMENTS
    • /
    • 0 LIKES
    • nilriri™
      2005.06.09 09:27
      (grid.cells[1,r] <> '  ')  이게 정확히 원하는 결과를 리턴하나요? Trim()...
    • 허학송
      2005.06.09 19:50
      감사합니다. 역시 제가 초보긴 초보인가 보군요. 이런 방법을 생각 못하다니. 많이 배우고 있습니다.
    • nilriri™
      2005.06.09 22:22
      OnCalcFields 이벤트를 잘못 이해하신듯 합니다. filter를 왜 해주시는지? 그리고..filter string을 ...
    • 크로이첼
      2005.06.09 23:33
      답변 감사합니다. 제가 그냥 어제 원하는 결과값을 얻는 프로시져로 만들어 버렸네요 ^^; 급하다 보니 다...
    • 장태원
    • 2005.06.08 22:35
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 민스맘
      2005.06.09 00:53
      우선 Query 에서 Row를 제한해서 가져오는 방법은요 oracle : select * from a_Table where rownu...
    • 황성욱
      2005.06.09 02:47
      DATA ACCESS 쪽에 ClientDataSet이라는 콤포넌트가 있습니다. 이걸 이용하시면 가능 한데.. MIDAS나 data...
    • 오승섭
      2005.06.10 19:09
    • 호야
    • 2005.06.08 20:14
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 성더기
      2005.06.09 01:26
      델파이 시디를 가지고 계신다면 시디안에 인스톨쉴드 Express라고 델파이용으로 번들된 버전이 있습니다 ...
    • 유응철
      2005.06.09 02:40
      델파이에 번들로 제공된 것이 어렵다면, 한글설명이 잘 되어 있는 installshield Factory 2.70 인가가 있습...
    • 임정미
      2005.06.09 07:10
    • 이승민
      2005.06.08 18:16
      음 rs232c 를 사용할때 여러가지 방법들을 사용하는데 그중 제가 쓰는 방법은 comport 당 하나의 Timer 나 ...
    • 프란시스
      2005.06.08 22:49
      쓰레드를 하나  발생(create) 시켜서 지속적으로 read하도록 하는 방법은 어떤것인지요? 부탁드...
    • 한만교
      2005.06.09 03:14
      제가 하는 일반적인 그러나 정석(반드시 정석이라 할 순 없지만..ㅎㅎ)이라 할수 있는 방법입니다.. 쓰...
    • 프란시스
      2005.06.09 22:53
      전 일단 급해서 그냥 thread를 생성해서 바로 free시키는 방법으로 그냥 진행했습니다. 별문제없이 잘 처리...
    • 도끼로이마까
      2005.06.09 04:38
      어떤 크기를 말씀하시는건지,,, 자세하게 질문해주세여,,
    • 최용일
      2005.06.08 06:49
      안녕하세요. 최용일입니다. 화면이 바뀔때마다 그 화면에 대한 정보를 순차적으로 기록해놓으세요. 그럼...
    • 델초보
      2005.06.08 23:15
      드디어 답변이 ^^;; 답변 감사드리고요. 저도 그런 생각까지는 했는데 지금 만드는 프로그램이 장비와...
    • 최용일
      2005.06.08 23:52
      안녕하세요. 최용일입니다. 데이터를 뿌려주는 화면이라면... 화면에 대한 정보는 그 데이터들이 되겠죠...
    • 델초보
      2005.06.09 02:10
      답변감사합니다. 지식이 짧아서 하나하나 진행하기가 매우 힘드내요. 수고하세요...
    • 한상민
      2005.12.22 00:55
      다들 넘 힘들게 생각하는거 같아서 6개월 지난 후 답변 올립니다. procedure TForm1.WebBrowser1C...
    • 홍미자
    • 2005.06.08 02:36
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 이승민
      2005.06.08 18:31
      델파이의 몇 버젼을 사용하신지 몰라서 그냥 제가 알고 있는 기초적인 내용만 말씀드리겠습니다. 델파이의...
    • 주웰
      2005.06.08 19:01
      절대 태클아닙니다 ^^;; 오해 없으시길... 이승민님께서 설명하신것 중에 동기식은 Linux, Unix 에서 보...
    • 홍미자
      2005.06.09 00:42
      ..
    • 정찬희
      2005.06.08 04:48
      위로 이동하는 코드에서   <!--CodeS--> if ( ListBox1.ItemIndex <> 0) then &l...
    • 오경태
    • 2005.06.08 01:43
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 천희택
      2005.06.08 17:48
      리눅스에 msyql을 설치하셨으면... 우선 DB를 만드셔야 합니다. 그리고 테이블을 만드시고 .... 그리...
    • 오경태
      2005.06.08 19:16
      감사합니다..제가 이곳싸이트에 올린 질문중에 처음으로 친절히 답해주셨습니다... 또 하룻밤새워..db ...
    • 박정훈
      2005.06.09 19:17
      강의실에 가면 MySQL+Zeos 연동 강좌가 올라가 있답니다.. 저도 맛난거 사주시나요??? 푸흐흐... 농담이었...
    • 호야
    • 2005.06.08 01:12
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2005.06.08 18:58
      안녕하세요. 최용일입니다. 델파이 자체적인 기능엔 없습니다. GExpert라고 하는 Third-party Add-on...
    • LDS
      2005.06.08 01:54
      그냥 참고 삼아 232c통신의 경험을.... 232c에 물려 있는게 " PDA "라고 가정 할게요 PDA에서는 ...
    • 프란시스
      2005.06.08 02:58
      네 감사합니다 근데 프로토콜은 괜찮은데요. ㅎㅎ 백그라운딩 프로새서로 하려구요 그냥 threed하...