자답. 왜 TZQuery에 Thread 옵션이 있어서 내부적으로 threadOpen이 있으면 좋은데. 없어서 그냥 이렇게 사용합니다.
type
TQThread = class(TThread)
private
FQuery: TZQuery;
FONEnd: Boolean;
FLogMsg: string;
procedure SetONEnd(const Value: Boolean);
protected
procedure Execute; override;
public
constructor Create(Query: TZQuery);
property OnEnd: Boolean read FONEnd write SetONEnd;
procedure SyncLogMsg;
end;
constructor TQThread.Create(Query: TZQuery);
begin
inherited Create(True);
FQuery := Query;
// FreeOnTerminate := True; //Free thread when finished executing
FONEnd := False;
Resume;
end;
procedure TQThread.Execute;
begin
try
try
FQuery.Open; // Perform the query
except
on E: EZSQLException do
begin
FLogMsg := 'TQThread : '+ E.Message;
Synchronize(SyncLogMsg);
end;
end;
finally
FONEnd := True;
end;
end;
procedure TQThread.SetONEnd(const Value: Boolean);
begin
FONEnd := Value;
end;
procedure TQThread.SyncLogMsg;
begin
if assigned(frmStateUpLoader) then
begin
if Trim(FLogMsg) <> '' then
begin
frmStateUpLoader.PrintLog(FLogMsg);
FLogMsg := '';
end;
end;
end;
사용시.
// 쓰레드를 빌어 쿼리 오픈.
aQuery.SQL.TEXT L= '쿼리';
aWaitQuery := TQThread.Create(aQuery);
//기다렸다가..
repeat
Sleep(1);
Application.ProcessMessages;
until aWaitQuery.OnEnd;
aWaitQuery.Terminate;
// Open되면.. 그후에 사용.
구조가 좀 지저분 한데
TZQuery를 상속받아서 Open시 Thread로 동작하는 클래스를 만들 수 있을까요??
kivalan 님이 쓰신 글 :
: 안녕하세요.
:
: 델파이 XE2 이구요.
: ZeosDB 사용시. 테이블이 거대해지면. TZQuery 에서 Open 시에 렉이 걸리는데.
: 이게 Application 렉이 걸려 버립니다.
:
:
: Query 사용시에 어떻게 사용하시나요?
: 쓰레드에 넣어서 출력해야 하는건지요?
:
|