본문 바로가기

언어/delphi

hex 전송 속도 개선?

http://www.delmadang.com/community/bbs_view.asp?bbsNo=17&bbsCat=0&indx=454950&page=8

Comport를 사용 해서 로고 그림 파일을 시리얼 전송 할려고 합니다.

속도를 개선 하기 위해 그레이스케일로 변환 하여 전송 하려고 합니다.

그런데 전송되는 속도를 ProgressBar로 보니 1초에 1개씩 보내는것 같이 느껴지네요.

속도를 더 빨리 할 수는 없을까요?


 
var
  i : integer;
  Buff : Byte;
  HexString : String;
begin
  try
    // 포트 연결
    // 그림파일 HEX로 변경 -> Memo에 넣기
    HexString := Trim(Memo1.Text);

    if Length(HexString) > 10 then
    begin
      ProgressBar1.Max := Length(HexString);
      
      for i := 1 to Length(HexString)  do
      begin
        if (i mod 2) = 0 then
        begin
           Buff := Byte(HexToint(    Copy(HexString,i-1,2)     ));

           ComPort.Write(Buff, Sizeof(Buff) );
        end;

        ProgressBar1.Position := i;
        Application.ProcessMessages;
      end;
    end 
    else begin
    end;

  finally
    //포트 닫기
    
  end;



답변 -------

현재 소스에서 시간이 늦는 이유는 이 부분으로 예상되네요.
ProgressBar1.Position := i;
Application.ProcessMessages;

ComPort로 Write한 후 UI 변경은 간헐적으로만 하시구요.
쓰레드를 적용하면 빨라질겁니다.

// 쓰레드 시작
procedure TForm1.Button1Click(Sender: TObject);
begin
TThread.CreateAnonymousThread(procedure ()
var
  i : integer;
  Buff : Byte;
  HexString : String;
  iProgress: Integer;
begin
  try
    // 포트 연결
    // 그림파일 HEX로 변경 -> Memo에 넣기
    HexString := Trim(Memo1.Text);

    if Length(HexString) > 10 then
    begin
      TThread.Synchronize (TThread.CurrentThread, procedure ()
      begin
        try          
          ProgressBar1.Max := Length(HexString);
        except
        end;
      end);
      
      iProgress := 0;
      for i := 1 to Length(HexString)  do
      begin
        if (i mod 2) = 0 then
        begin
           Buff := Byte(HexToint(    Copy(HexString,i-1,2)     ));

           ComPort.Write(Buff, Sizeof(Buff) );
        end;
        
        Inc(iProgress);
        if (iProgress mod 100) = 0 then
        begin
          // 100단위마다 Progress바를 변경   
          TThread.Synchronize (TThread.CurrentThread, procedure ()
          begin     
            ProgressBar1.Position := iProgress;
          end);
        end;
      end;
    end 
    else begin
    end;

  finally
    //포트 닫기
  end;
end).Start;

'언어 > delphi' 카테고리의 다른 글

bass 2.4  (0) 2020.11.21
AsyncPro  (0) 2020.11.21
BinToHexEx  (0) 2018.05.15
자바의 Toast VCL용입니다  (0) 2018.05.15
TBitmap 원본으로부터 크기조정한 비트맵 얻기 (Transparent, Antialiased)  (0) 2018.05.15