스레드를 밑에처럼 만들었는데 이걸 사용할때는 괜찮거든요.
그런데 실행파일을 닫아버리면 메모리 에러가 나네요
실행중일땐 에러가 안뜹니다..
스레드를 죽이지 않아서 그런건지 어떤건지 감이 안오네요..
스레드에 관해 알고 계시는분 좀 조언좀 부탁합니다.
/*이상 스레드 실행시키는 버튼입니다.*/
procedure TfMainToolBar.Button1Click(Sender: TObject);
var
MergeThread1 : MergeThread;
begin
MergeThread1 := MergeThread.Create(MergeQuery1, MergeGrid1,ZPgSqlDatabase1,ZPgSqlTransact2);
MergeThread1.OnTerminate := lastThread;
end;
type
MergeThread = class(TThread)
private
{ Private declarations }
Query1: TZPgSqlQuery;
Grid1: TMergeGrid;
Transact1: TZPgSqlTransact;
Database1: TZPgSqlDatabase;
//ZPgSqlTransact1: TZPgSqlTransact;
protected
procedure Execute; override;
procedure MselectQuery;
public
constructor Create(Query:TZPgSqlQuery ;Grid : TMergeGrid;Database: TZPgSqlDatabase;Transact: TZPgSqlTransact);
destructor Destroy; override;
end;
const
DIMS_INI_FILE = 'DIMS.INI';
implementation
{ Important: Methods and properties of objects in VCL can only be used in a
method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure MergeThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ MergeThread }
constructor MergeThread.Create(Query:TZPgSqlQuery ;Grid : TMergeGrid;Database: TZPgSqlDatabase;Transact: TZPgSqlTransact);
begin
Query1:= Query;
Grid1:= Grid;
Transact1:=Transact;
Database1:=Database;
freeOnTerminate := true;
Inherited Create(false);
end;
destructor MergeThread.Destroy;
begin
{Database1.Free;
Transact1.Free;
Query1.Free;
Grid1.Free;}
Inherited Destroy;
end;
procedure MergeThread.MselectQuery;
var
DimsIniFile : TIniFile;
uid : String;
begin
DimsIniFile := TIniFile.Create(DIMS_INI_FILE);
Transact1.Database := Database1;
Query1.Database := Database1;
Query1.Transaction := Transact1;
with Database1 do begin
Database := 'dims';
Host := DimsIniFile.ReadString('DIMS SERVER', 'IP', '');
Login := 'dims';
Password := 'dimssql';
Connect;
end;
Query1.close;
Query1.sql.Clear;
Query1.Sql.Add('select * from admin_tbl');
Query1.Open;
Grid1.Cells[1, 1]:= IntTostr(Query1.RecordCount);
end;
procedure MergeThread.Execute;
begin
{ Place thread code here }
Synchronize(MselectQuery);
if Terminated then exit;
end;
안녕하세요.
제가 보기에는 Thread에서 어떤 오류가 있어서 나는 에러같지는 않습니다.
source를 보니 실질적으로 Thread에서 실행되는 부분은 하나도 없군요.
Synchronize를 사용하게 될 경우에는 Synchronize안에 있는 함수는 Main Thread에서 호출 되거든요.
결과적으로 Thread에서 한것은 Synchronize호출하고 Main Thread가 이 함수 수행할 때까지 기다린 다음에 종료한것 밖에 없기 때문에 다른 곳에서 나는 문제 같군요.
도움이 되시길...