Thread를 사용하는데, 처음 Create한후 작업이 끝난후 Free를 호출합니다.
그런데 관리도구-시스템 성능 모니터를 사용하여 현재의 Thread를 살펴보면 해당되는 Thread가 남아 있는 것을 알 수 있습니다.
현재 Program이 Thread를 생성/소멸을 반복하는데 결국 어느 한계에 도달하면
Thread를 생성하지 못하는 것으로 보입니다.
Thread를 완전히 없애려면 어떻게 해야 합니까? 도움을 부탁드립니다.
사용 OS : WindowsNT 4.0(Service Pack3)
--- Program Source -----
unit utCIM;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DBTables, Db, utBarcode, Math, utParameter, Psock, NMFtp, utString;
type
TSaveThread = class(TThread)
private
GetTableName : String;
Judge : String;
protected
procedure Execute; override;
public
constructor Create;
destructor Destroy; override;
end;
TfrmCIM = class(TForm)
Database: TDatabase;
Table: TTable;
Query: TQuery;
NMFTP1: TNMFTP;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
ST : TSaveThread;
Running : Boolean;
procedure proSaveDataToCIM;
end;
var
frmCIM: TfrmCIM;
implementation
uses
utMSD, utInitial, utMain, utError, utStation50;
{$R *.DFM}
constructor TSaveThread.Create;
begin
inherited Create(False);
frmCIM.Running := True;
end;
destructor TSaveThread.Destroy;
begin
frmCIM.Running := False;
frmMSD.lblHost.Caption := '전송완료';
// if frmCIM.BarCodeNotPrinted then
// Synchronize(frmBarCode.proSendDataToPrinter);
inherited Destroy;
end;
procedure TSaveThread.Execute;
begin
//작업 진행
Free;
end;
procedure TfrmCIM.FormCreate(Sender: TObject);
begin
Running := False;
end;
procedure TfrmCIM.proSaveDataToCIM;
begin
frmMain.DataIs := True;
if not Running then //if TSaveThread is Created already wait next save time
begin
ST := TSaveThread.Create;
ST.Priority := tpLower;
end;
end;
end.
>
> Thread를 사용하는데, 처음 Create한후 작업이 끝난후 Free를 호출합니다.
> 그런데 관리도구-시스템 성능 모니터를 사용하여 현재의 Thread를 살펴보면 해당되는 Thread가 남아 있는 것을 알 수 있습니다.
> 현재 Program이 Thread를 생성/소멸을 반복하는데 결국 어느 한계에 도달하면
> Thread를 생성하지 못하는 것으로 보입니다.
>
> Thread를 완전히 없애려면 어떻게 해야 합니까? 도움을 부탁드립니다.
>
>
> 사용 OS : WindowsNT 4.0(Service Pack3)
>
>
> --- Program Source -----
>
> unit utCIM;
>
> interface
>
> uses
> Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
> DBTables, Db, utBarcode, Math, utParameter, Psock, NMFtp, utString;
>
>
> type
> TSaveThread = class(TThread)
> private
> GetTableName : String;
> Judge : String;
> protected
> procedure Execute; override;
> public
> constructor Create;
> destructor Destroy; override;
> end;
>
> TfrmCIM = class(TForm)
> Database: TDatabase;
> Table: TTable;
> Query: TQuery;
> NMFTP1: TNMFTP;
> procedure FormCreate(Sender: TObject);
> private
> { Private declarations }
> public
> { Public declarations }
> ST : TSaveThread;
> Running : Boolean;
> procedure proSaveDataToCIM;
> end;
>
> var
> frmCIM: TfrmCIM;
>
> implementation
> uses
> utMSD, utInitial, utMain, utError, utStation50;
>
> {$R *.DFM}
>
> constructor TSaveThread.Create;
> begin
> inherited Create(False);
>
> frmCIM.Running := True;
> end;
>
> destructor TSaveThread.Destroy;
> begin
> frmCIM.Running := False;
> frmMSD.lblHost.Caption := '전송완료';
>
> // if frmCIM.BarCodeNotPrinted then
> // Synchronize(frmBarCode.proSendDataToPrinter);
>
> inherited Destroy;
> end;
>
> procedure TSaveThread.Execute;
> begin
> //작업 진행
>
> Free;
> end;
>
> procedure TfrmCIM.FormCreate(Sender: TObject);
> begin
> Running := False;
> end;
>
> procedure TfrmCIM.proSaveDataToCIM;
> begin
> frmMain.DataIs := True;
> if not Running then //if TSaveThread is Created already wait next save time
> begin
> ST := TSaveThread.Create;
> ST.Priority := tpLower;
> end;
> end;
>
> end.
>
안녕하세요 김영대입니다
Thread 을 free 시키는 방법은 두가지가 있는데
Thread의 실행이 종료하면 자동으로 free되게 설정하는 방법과
Thread가 종료할때까지 기다리다(but blocking) 외부에서
Terminate 로 free 시키는 방법입니다
<첫번째 방법>
constructor TSaveThread.Create;
begin
// thread object의 instance를 생성한다
// Create의 파라미터가 False이면 thread를 생성한후 즉시 Execute를 호출하여 실행한다
// " True이면 Resume을 호출하기 전까지 실행하지 않는다(suspended)
inherited Create(True);
// thread의 실행이 종료하면 자동으로 free되게 설정
FreeOnTerminate := True;
// 실행이 일시 중지된(suspended) thread를 실행한다
Resume;
frmCIM.Running := True;
end;
<두번째 방법>
if not Running then
begin
ST := TSaveThread.Create;
ST.Priority := tpLower;
ST.Terminate;
ST.WaitFor; // thread가 종료할때까지 기다린다(but blocking)
ST := nil;
end;
저도 Thread 를 많이 안써봐서 정확한지 모르겠지만 전에
NT 프로그래밍할때 첫번째 방법으로 free 가 잘 안되서
두번째 방법으로 했었습니다