Q&A

  • Thread를 완전히 없애려면?


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.



2  COMMENTS
  • Profile
    김영대 1999.06.30 20:40
    강두헌 께서 말씀하시기를...

    >

    > 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 가 잘 안되서

    두번째 방법으로 했었습니다

  • Profile
    강두헌 1999.07.05 18:43
    김영대 께서 말씀하시기를...

    >

    > 안녕하세요 김영대입니다

    > 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 가 잘 안되서

    > 두번째 방법으로 했었습니다



    도와주신 덕분에 문제가 풀렸습니다. 감사드립니다.