关于thread中传递类的实例(100分)

  • 主题发起人 主题发起人 iamtalent
  • 开始时间 开始时间
I

iamtalent

Unregistered / Unconfirmed
GUEST, unregistred user!
type
TmyThread = Class(TThread)
private
Fmyclass : Tmyclass;
protected
procedure Execute;override;
public
constructor Create(myclass : Tmyclass);
destructor Destroy; override;
end;
procedure TmyThread.create(myclass : Tmyclass);
begin
Fmyclass := myclass;
...
end;
procedure execute;
begin
...Fmyclass...此处的Fmyclass和create处产生的fmyclass不同了。
end;
 
procedure TmyThread.create(myclass : Tmyclass);
begin
Fmyclass:=Tmyclass.create(self);//加上这一句试试呢
Fmyclass := myclass;
...
end;
 
楼上的兄台,这样偶试过的,也不行。
type
Tmyclass = class
字段1 : word;
字段2 : pointer;
public
constructor Create(code: Word; p: Pointer);
end;

主要是Pointer指向的东东不对了,传进来code的值是对的。
上面的情况如果偶不放在线程中执行则没有问题。
请教!
 
用指针呢?pmyclass : ^Tmyclass
 
pmyclass在create的初始化后数据是对的,到execute里面就不对了。
 
有兄弟知道怎么回事吗?
 
我觉得 还是你execute里的代码有问题吧。你都贴出来让大家帮你看看
 
在Thread中创建窗口会出错为什么?
Thread完成后会自动关闭
 
execute里我只测试性的一句代码。
ShowMessage(copy(pchar(Fmyclass.字段2),1,1)),为空,说明在execute执行的时候指针已经被清空了
 
在thread类的execute中是不是不能对指针操作?
 
那个p用GetMem之类分配过吗?
 
p在线程create的时候已经分配过的,而且这时候的P是正常的,当把P在execute执行的时候就不对了,P为线程的private指针变量。
 
如果把execute方法放到public下直接运行的话,所有的东东都是正常的,但是放到protected下,当作线程来执行的话就不对了
 
I can declare it is your code that caused this problem. in thread constructor,
of course class instance can be passed.
see my code, it's OK!

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

type
Tmyclass = class
Field1: Word;
Field2: Pointer;
public
constructor Create(code: Word; p: Pointer);
end;

TmyThread = Class(TThread)
private
Fmyclass : Tmyclass;
protected
procedure Execute; override;
public
constructor Create(myclass : Tmyclass);
end;
var
myclass: Tmyclass;
P: PChar;

constructor Tmyclass.Create(code: Word; p: Pointer);
begin
Field1 := code;
Field2 := p;
end;

constructor TmyThread.Create(myclass : Tmyclass);
begin
Fmyclass := myclass;
FreeOnTerminate := True;
inherited Create(False);
end;

procedure TmyThread.Execute;
begin
ShowMessage(PChar(Fmyclass.Field2));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
TmyThread.Create(myclass);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
P := StrAlloc(31);
FillChar(P^, 30, 'F');
myclass := Tmyclass.Create(2, P);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
myclass.Free;
StrDispose(P);
end;

end.
 
在thread类的指针操作没有限制吧。我觉得你的测试代码有问题
ShowMessage(copy(pchar(Fmyclass.字段2),1,1)) //在线程的执行部分showmessage?
你在你的主窗体上方一个edit,然后把showmessage用下面的代码换掉看看结果
sendmessage(formmain.edit1.handle,wm_settext,0,integer(Fmyclass.字段2));
 
申明:
constructor Create(Owner:TThread; myclass : Tmyclass);reintroduce; overload;

实现:
procedure TmyThread.create(Owner:TThread; myclass : Tmyclass);
begin
inherited Create(Owner);//这句一定不能少。
Fmyclass := myclass;
end;

看看这样行不行?
 
type
TmyThread = Class(TThread)
private
Fmyclass : Tmyclass;
protected
procedure Execute;override;
public
constructor Create(myclass : Tmyclass);
destructor Destroy; override;
end;
procedure TmyThread.create(myclass : Tmyclass);
begin
[blue] inherited create(false);[/blue]
Fmyclass := myclass;
...
end;
procedure execute;
begin
...Fmyclass...此处的Fmyclass和create处产生的fmyclass不同了。
end;
 
type
Pmyclass = ^Tmyclass;

TmyThread = Class(TThread)
private
Fmyclass : Tmyclass;
protected
procedure Execute;override;
public
constructor Create(myclass : Pmyclass);
destructor Destroy; override;
end;
procedure TmyThread.create(myclass : Pmyclass);
begin
inherited create(false);
Fmyclass := myclass^;
...
end;
procedure execute;
begin
....
end;
 
现在是在什么都不改的情况下,
只要在mythread := Tmythread.create(myclass);后面跟一个showmessage或者messagebox则什么都正常了。

如果开始是inherited create(true);则在mythread.resume后面跟一个showmessage或者messagebox就可以了。


 
后退
顶部