willem ha scritto:
Please send your modified threadbug program , so that i can compare the results on my system.
Please find it here attached.

Giuliano

program multithread;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  Classes,sysutils
  { add your units here };

type

  { TThreadBug }

  TThreadBug=class(TThread)
  protected
    procedure Execute; override;
  public
    constructor Create(CreateSuspended: Boolean);
  end;

var
  Ft: Boolean;
  BugArray: array [0..299] of TThreadBug;

{ TThreadBug }

procedure TThreadBug.Execute;
var
  I,J:Integer;
begin
  write('.');
  repeat
    sleep(10);
  until Terminated;
end;

constructor TThreadBug.Create(CreateSuspended: Boolean);
begin
  inherited Create (CreateSuspended);
  FreeOnTerminate:= Ft;
end;

var t1:TThreadBug; ans:string; I: Integer;

begin

  Ft := False; // set FreeOnTerminate
  // Here we create a lot of threads
  writeln('Type <Enter> to start threads');
  readln(ans);
  
  for I := 0 to high(BugArray) do begin
    BugArray[I]:=TThreadBug.Create(false);
    end;
  WriteLn('-');
  writeln('Type <Enter> to Destroy threads');
  readln(ans);
  for I := 0 to high(BugArray) do begin
    t1 := BugArray[I];
    t1.Terminate;
    t1.WaitFor;
    write ('.');
    if not Ft then begin
      sleep(50);
      t1.Free;
      end;
    end;
  WriteLn('-');
  // Here we create just one
  writeln('Type <Enter> to start thread');
  readln(ans);

  t1:=TThreadBug.Create(false);

  writeln('WaitFor? [y/N]');
  readln(ans);
  t1.Terminate;
  if ans='y' then begin
    if not Ft then begin
      t1.WaitFor;
      writeln('OS thread memory released.');
      end;
  end else
    writeln('OS thread memory left dangling.');

  if not Ft then t1.Free;
  writeln('Confirm with top now!');
  readln;
end.


Reply via email to