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 |