Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Categories

TThread

First here is the unit with the thread

unit Unit2;
interface
uses
Classes,windows;
type
dirmon = class(TThread)
public
nr:integer;
constructor create(a:integer);
private
{ Private declarations }
protected
procedure Execute; override;
end;
implementation
{ dirmon }
constructor dirmon.create(a:integer);
begin
nr:=a;
FreeOnTerminate:=true;
inherited Create(False);
end;

procedure dirmon.Execute;
var ok:boolean;s:string;i:integer;
begin
ok:=false;
for i:=2 to trunc(sqrt(nr))do
if nr mod i=0 then ok:=true;
if ok then s:='nu este prim'
else s:='este prim';
messagebox(0,pchar(s),nil,0);
inherited Terminate;
{ Place thread code here }
end;
end.

It tests if a number is prime or not and pops up a dialogbox.It compiles but when I call the create constructor during running it gives an access violation error and delphi points at the first line in the create procedure:nr:=a;

Here is the implememtantion of the unit1 which calls the create constr

implementation
uses unit2;
{$R *.dfm}
var ex:dirmon;
procedure TForm1.Button1Click(Sender: TObject);
begin
ex.create(strtoint(edit1.Text));
end;

end.

Can you tell me what is the problem ?
10x

Comments

  • zibadianzibadian Posts: 6,349Member
    : First here is the unit with the thread
    : [code]
    : unit Unit2;
    : interface
    : uses
    : Classes,windows;
    : type
    : dirmon = class(TThread)
    : public
    : nr:integer;
    : constructor create(a:integer);
    : private
    : { Private declarations }
    : protected
    : procedure Execute; override;
    : end;
    : implementation
    : { dirmon }
    : constructor dirmon.create(a:integer);
    : begin
    : nr:=a;
    : FreeOnTerminate:=true;
    : inherited Create(False);
    : end;
    :
    : procedure dirmon.Execute;
    : var ok:boolean;s:string;i:integer;
    : begin
    : ok:=false;
    : for i:=2 to trunc(sqrt(nr))do
    : if nr mod i=0 then ok:=true;
    : if ok then s:='nu este prim'
    : else s:='este prim';
    : messagebox(0,pchar(s),nil,0);
    : inherited Terminate;
    : { Place thread code here }
    : end;
    : end.
    :
    : It tests if a number is prime or not and pops up a dialogbox.It compiles but when I call the create constructor during running it gives an access violation error and delphi points at the first line in the create procedure:nr:=a;
    :
    : Here is the implememtantion of the unit1 which calls the create constr
    :
    : implementation
    : uses unit2;
    : {$R *.dfm}
    : var ex:dirmon;
    : procedure TForm1.Button1Click(Sender: TObject);
    : begin
    : [red]ex.create(strtoint(edit1.Text));[/red]
    : end;
    :
    : end.
    : [/code]
    : Can you tell me what is the problem ?
    : 10x
    :
    The read line is the problem. The proper way to create an object is this:
    [code]
    ex := DirMon.Create(strtoint(edit1.Text));
    [/code]
    This is because Delphi needs to know which type the object is. The following code is also valid:
    [code]
    var
    [b]ex: TThread[/b];

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    ex := DirMon.Create(strtoint(edit1.Text));
    [/code]

  • bogdanul2003bogdanul2003 Posts: 153Member
    [b][red]This message was edited by bogdanul2003 at 2005-9-4 11:58:45[/red][/b][hr]
    : : First here is the unit with the thread
    : : [code]
    : : unit Unit2;
    : : interface
    : : uses
    : : Classes,windows;
    : : type
    : : dirmon = class(TThread)
    : : public
    : : nr:integer;
    : : constructor create(a:integer);
    : : private
    : : { Private declarations }
    : : protected
    : : procedure Execute; override;
    : : end;
    : : implementation
    : : { dirmon }
    : : constructor dirmon.create(a:integer);
    : : begin
    : : nr:=a;
    : : FreeOnTerminate:=true;
    : : inherited Create(False);
    : : end;
    : :
    : : procedure dirmon.Execute;
    : : var ok:boolean;s:string;i:integer;
    : : begin
    : : ok:=false;
    : : for i:=2 to trunc(sqrt(nr))do
    : : if nr mod i=0 then ok:=true;
    : : if ok then s:='nu este prim'
    : : else s:='este prim';
    : : messagebox(0,pchar(s),nil,0);
    : : inherited Terminate;
    : : { Place thread code here }
    : : end;
    : : end.
    : :
    : : It tests if a number is prime or not and pops up a dialogbox.It compiles but when I call the create constructor during running it gives an access violation error and delphi points at the first line in the create procedure:nr:=a;
    : :
    : : Here is the implememtantion of the unit1 which calls the create constr
    : :
    : : implementation
    : : uses unit2;
    : : {$R *.dfm}
    : : var ex:dirmon;
    : : procedure TForm1.Button1Click(Sender: TObject);
    : : begin
    : : [red]ex.create(strtoint(edit1.Text));[/red]
    : : end;
    : :
    : : end.
    : : [/code]
    : : Can you tell me what is the problem ?
    : : 10x
    : :
    : The read line is the problem. The proper way to create an object is this:
    : [code]
    : ex := DirMon.Create(strtoint(edit1.Text));
    : [/code]
    : This is because Delphi needs to know which type the object is. The following code is also valid:
    : [code]
    : var
    : [b]ex: TThread[/b];
    :
    : procedure TForm1.Button1Click(Sender: TObject);
    : begin
    : ex := DirMon.Create(strtoint(edit1.Text));
    : [/code]
    :
    :

    10x zibadian


Sign In or Register to comment.