자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Firemonkey ListBox 테스트시 문의 ( 속도 )
2014.04.30 23:50
1. TAniIndicator ( 로딩중 표시 )
2. TListBox Addobjcet로 동적으로 약 오천개 입력
버튼 1 )
AniIndicator1.Visible := true;
AniIndicator1.Enabled := true;
listbox.BeginUpdate;
Application.ProcessMessages;
for i := 1 to 26 do
begin
listboxGroupHeader = TListBoxGroupHeader.Create(listbox);
listboxGroupHeader.Height := 40;
listboxGroupHeader.Text := inttostr(i) + ' Header';
listbox.AddObject(listboxGroupHeader);
for j := 1 to 200 do
begin
listboxitem := TListBoxItem.Create(listbox);
listboxitem.Height := 40;
listboxitem.Text := inttostr(i) + ' / ' + c;
listboxitem.ItemData.Accessory := TListBoxItemData.TAccessory(i mod 3);
listbox.AddObject(listboxitem);
end;
end;
listbox.EndUpdate;
aniIndicator1.Visible := false;
AniIndicator1.Enabled := false;
----> 버튼 클릭시 폼이 얼어버리는 현상 ( 안드로이드 응답없음 및 대기상태에 있으면 조회됨 )
버튼2) 쓰레드를 사용하니 더 느려짐 ㅠㅠ;; ( 응답없음은 나오지 않으나 제가 뭘 잘못했는지 초보라서 ㅜㅜ;; )
# 클래스정의 ( 쓰레드 )
TLoadThread = class(TThread)
public
Config: Boolean;
FLoopValue : integer;
FChar : char;
constructor Create(const aConfig: Boolean); reintroduce;
protected
procedure DoProcessing;
procedure DoProcessing2;
procedure Execute; Override;
end;
# 버튼클릭 프로시져 (아래)
zLThread:= TLoadThread.Create(True);
zLThread.OnTerminate := ThreadTerminated;
zLThread.Start;
Loading := True;
AniIndi.Visible := True;
AniIndi.Enabled := True;
# Execute 프로시져
procedure TLoadThread.Execute;
var cc : char;
i : integer;
begin
FreeOnTerminate:= true;
Form1.lbxList.Clear;
Form1.lbxList.BeginUpdate;
for cc := 'a' to 'z' do
begin
FChar := cc;
Synchronize(DoProcessing); -- Header 입력
for i := 1 to 200 do
begin
FLoopValue := i;
Synchronize(DoProcessing2); -- Detail 입력
end;
end;
Form1.lbxList.EndUpdate;
end;
procedure TForm1.ThreadTerminated(Sender: TObject);
begin
zLThread := nil;
Loading := False;
AniIndi.Enabled := False;
AniIndi.Visible := False;
end;
# 하고자하는 요점은 리스트 박스에 일부 데이터 입력 , 입력시 로딩이미지 사용자 대기상태 , 리스트 박스에 표시 후 로딩이미지 중지를 구현 하려다 보니깐 ... 잘 안됩니다. ㅠㅠ;;
Firemonkey ListBox 테스트시 문의 ( 속도 )
2014.04.30 23:50
1. TAniIndicator ( 로딩중 표시 )
2. TListBox Addobjcet로 동적으로 약 오천개 입력
버튼 1 )
AniIndicator1.Visible := true;
AniIndicator1.Enabled := true;
listbox.BeginUpdate;
Application.ProcessMessages;
for i := 1 to 26 do
begin
listboxGroupHeader = TListBoxGroupHeader.Create(listbox);
listboxGroupHeader.Height := 40;
listboxGroupHeader.Text := inttostr(i) + ' Header';
listbox.AddObject(listboxGroupHeader);
for j := 1 to 200 do
begin
listboxitem := TListBoxItem.Create(listbox);
listboxitem.Height := 40;
listboxitem.Text := inttostr(i) + ' / ' + c;
listboxitem.ItemData.Accessory := TListBoxItemData.TAccessory(i mod 3);
listbox.AddObject(listboxitem);
end;
end;
listbox.EndUpdate;
aniIndicator1.Visible := false;
AniIndicator1.Enabled := false;
----> 버튼 클릭시 폼이 얼어버리는 현상 ( 안드로이드 응답없음 및 대기상태에 있으면 조회됨 )
버튼2) 쓰레드를 사용하니 더 느려짐 ㅠㅠ;; ( 응답없음은 나오지 않으나 제가 뭘 잘못했는지 초보라서 ㅜㅜ;; )
# 클래스정의 ( 쓰레드 )
TLoadThread = class(TThread)
public
Config: Boolean;
FLoopValue : integer;
FChar : char;
constructor Create(const aConfig: Boolean); reintroduce;
protected
procedure DoProcessing;
procedure DoProcessing2;
procedure Execute; Override;
end;
# 버튼클릭 프로시져 (아래)
zLThread:= TLoadThread.Create(True);
zLThread.OnTerminate := ThreadTerminated;
zLThread.Start;
Loading := True;
AniIndi.Visible := True;
AniIndi.Enabled := True;
# Execute 프로시져
procedure TLoadThread.Execute;
var cc : char;
i : integer;
begin
FreeOnTerminate:= true;
Form1.lbxList.Clear;
Form1.lbxList.BeginUpdate;
for cc := 'a' to 'z' do
begin
FChar := cc;
Synchronize(DoProcessing); -- Header 입력
for i := 1 to 200 do
begin
FLoopValue := i;
Synchronize(DoProcessing2); -- Detail 입력
end;
end;
Form1.lbxList.EndUpdate;
end;
procedure TForm1.ThreadTerminated(Sender: TObject);
begin
zLThread := nil;
Loading := False;
AniIndi.Enabled := False;
AniIndi.Visible := False;
end;
# 하고자하는 요점은 리스트 박스에 일부 데이터 입력 , 입력시 로딩이미지 사용자 대기상태 , 리스트 박스에 표시 후 로딩이미지 중지를 구현 하려다 보니깐 ... 잘 안됩니다. ㅠㅠ;;
일반적으로 모바일(데스크탑에서도)에서 한번에 5000개의 데이터를 화면에 뿌리는 작업은 지양되어야 할 것 같습니다.
대표적인 모바일 앱인 페이스북, 트위터 등에서도 초반에 일부의 데이터를 표시하고
화면을 이동하여 더 많은 정보를 표시할 필요가 있을 경우 데이터를 추가하는 형태로 구성하고 있습니다.
수강생님도 좀 더 낳은 UX를 위해서 데이터를 나누어 처리하도록 구성을 변경하시면 화면에서 응답없음등의 얼어버리는 현상을 해소할 수 있지 않을까 싶습니다.
그리고 쓰레드는 되도록 UI와 무관한 영역에서 사용하셔야 합니다.
UI와 연관된 작업을 쓰레드로 처리할 경우 메인쓰레드와 사용자 쓰레드가 서로 간섭하여 오히려 더 좋지 않은 결과가 나올 것 같습니다.