有关线程和函数指针?
amiao 2003-08-20 03:38:46 代码看起来可能有点烦,不过都是些简单的code,请高手指点迷津!
线程同步类中的published方法时,Receive为inaccessible value,怎样解决?
分数可以再加.
部分代码如下:
...
type
TForm1 = class(TForm)
...
end;
//定义函数指针对象类型
TFunc = function: Integer of Object;
//定义接收线程
TReceiveThread = class(TThread)
private
FFunc: TFunc;
protected
procedure SynKernel;
procedure Execute; override;
end;
//定义核心类
TKernel = class
public
Receive: TList; //接收信息缓冲
function IsCreate: Integer;
published
destructor Destroy; override;
function SynReceive: Integer; //线程同步核心类方法
end;
var
Form1: TForm1;
Kernel: TKernel;
Re: TReceiveThread;
implementation
{$R *.dfm}
{====================TReceiveThread====================}
procedure TReceiveThread.SynKernel;
begin
TMethod(FFunc).Code := TKernel.MethodAddress('SynReceive');
if Assigned(TMethod(FFunc).Code) then
if FFunc=0 then ShowMessage('not assign')
else ShowMessage('assign');
end;
procedure TReceiveThread.Execute;
begin
FreeOnTerminate := True;
// while not Terminated do
Synchronize(SynKernel);
end;
{====================TKernel====================}
function TKernel.SynReceive: Integer;
begin
Result := 0;
//线程同步类中的published方法时,Receive为inaccessible value,怎样解决?
if Receive=nil then Exit;
//同样,这句代码也不行
// if not Assigned(Receive) then Exit;
Result := 1;
end;
constructor TKernel.Create;
begin
inherited;
Receive := TList.Create;
end;
destructor TKernel.Destroy;
begin
Receive.Free;
inherited;
end;
function TKernel.IsCreate: Integer;
begin
if Receive=nil then
Result := 0
else Result := 1;
end;
{====================TForm1====================}
procedure TForm1.FormCreate(Sender: TObject);
begin
Kernel := TKernel.Create;
Re := TReceiveThread.Create(False);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Kernel.Destroy;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//这里的调用一切正常
case Kernel.IsCreate of
0: Caption := 'not assign';
1: Caption := 'assign, no data';
end;
end;