//异步传送参数组
procedure TFormMain.ProcessFileTransferOutput();
var
Parameters: TStringlist;begin
Parameters:=TStringList.Create; Parameters.Add('1'); //操作类型
Parameters.Add('ProcessFileTransferOutput Ok!'); //操作参数 Asynchronous(Parameters,TFormMain.ProcessFileTransferOutput); //异步执行ProcessFileTransferOutput过程end;
//处理参数过程
procedure TFormMain.ProcessFileTransferOutput(PData:Pointer);
var
Parameters:TStringlist;
begin
Parameters:=PData; case StrToInt(Parameters[0]) of
1: begin
AddLineStr(Parameters[1],1,true);
end; 2: begin end;
end; Parameters.Free; //这句过后,程序显示Invalid pointer operation对话框,为什么啊??end;
解决方案 »
- access我在从另一个表里取数据出问题了,救我啊!
- 数据显示,求助.
- Table1有 ‘证人1ID’ 和 ‘证人2ID’字段。table2中有ID,姓名两个字段,如何显示表1并将Id号换为对应的姓名
- 想做游戏的进来看
- 如何使用installshield制作delphi+ado+access編寫的安裝程序﹖謝謝﹗
- 怎么像TOM,sina.com一样在IE地址栏下实现工具条?高手请教!!!!!!
- 数字字符串能转化为Longint吗?
- 我定义了button1.click事件,想在button2.click中调用button1.click事件,但不成功,怎么用?谢谢
- Hd-copy的磁盘感应功能怎么做?请给出例程!
- 我刚学DELPHI一个星期。现急需用delphi做一个网吧计费管理系统,哪位仁兄能雪中送炭?<[email protected]><qq:24748621>
- 为什么这段代码 能将DLL 插入到普通的EXE文件里面 而不能插入到系统DLL里面
- 共享ERP源码
Parameters.Free
能这样赋值吗?
传递的时候:
Asynchronous(PChar(Parameters.Text),TFormMain.ProcessFileTransferOutput); 函数内:
pData: PChar;Parameters.Text:=PData;
至于你的疑惑:
研究你的代码:procedure TFormMain.ProcessFileTransferOutput();
var
Parameters: TStringlist; //Parameters定义在这里,就是一个局部变量,这个过程结束后,这个对象就释放了.
//我个人猜想:变量的定义,只是定义"占位符"的过程,也就是说,告诉系统,从这个指针所指的地址开始,
//后面某段空间,将在Parameters调用Create的时候,使用. 占位嘛,就是占据一定数量的数据位.
//如果再分配空间,请不要采用这段空间.
//虽然这个过程结束时,Parameters释放了,但是,内存空间里面的值,还是没有变.还是释放前的值.begin
Parameters:=TStringList.Create; Parameters.Add('1'); //操作类型
Parameters.Add('ProcessFileTransferOutput Ok!'); //操作参数 Asynchronous(Parameters,TFormMain.ProcessFileTransferOutput); //异步执行ProcessFileTransferOutput过程 end;
//处理参数过程
procedure TFormMain.ProcessFileTransferOutput(PData:Pointer);
var
Parameters:TStringlist;
begin
Parameters:=PData; //这里,通过指针获得原来Parameter的地址,可能因为内存空间的值,刚好没有被系统重新分配给其他变量
//所以通过Parameters[i]来访问某个域访问内的内存值,还是存在的.
case StrToInt(Parameters[0]) of
1: begin
AddLineStr(Parameters[1],1,true);
end; 2: begin end;
end; Parameters.Free; //这句过后,程序显示Invalid pointer operation对话框,为什么啊?? //这里,你开始只是赋值一个地址而已,并没有创建对象,调用free,估计不行. 不如:Parameters := nil;
end; 以上纯属个人胡乱分析,哈哈,不知道是不是这样.
var
Parameters: TStringlist; begin
Parameters:=TStringList.Create; Parameters.Add('1'); //操作类型
Parameters.Add('ProcessFileTransferOutput Ok!'); //操作参数 Asynchronous(Parameters,TFormMain.ProcessFileTransferOutput); //异步执行ProcessFileTransferOutput过程
Parameters.Free;end;
2、带有引用计数功能的接口实现释放时引用计数值不为0
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;const
MM_ASYNCHRONOUS = WM_USER + 1;type DataMethod=procedure(PData:Pointer) of object;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure ProcessAsynchronous(var Message: TMessage); message MM_ASYNCHRONOUS; procedure ProcessFileTransferOutput(); overload;
procedure ProcessFileTransferOutput(PData:Pointer); overload; end;
var
Form1: TForm1; procedure Asynchronous(Method:DataMethod;PData:Pointer);type
TAThread = class(TThread)
public
procedure Execute; override;
end;
implementation{$R *.dfm}procedure TAThread.Execute;
begin
form1.ProcessFileTransferOutput;
Terminate;
end;procedure Asynchronous(Method:DataMethod;PData:Pointer);
type PMethod=^TMethod;
var
AMethod:PMethod;
begin New(AMethod); AMethod.Code:=TMethod(Method).Code;
AMethod.Data:=TMethod(Method).Data; PostMessage(Form1.Handle,MM_ASYNCHRONOUS,Integer(AMethod),Integer(PData));end;procedure TForm1.ProcessAsynchronous(var Message: TMessage);
type PMethod=^TMethod;
var
AMethod: PMethod;
begin AMethod := PMethod(message.WParam); DataMethod(AMethod^)(Pointer(Message.LParam));
//实在不知道为什么不简单忽略这个错误,哪位知道告知一下。。
{$I-}
try
Dispose(Pointer(Message.LParam));
finally
end;
{$I+}
if IOResult<>0 then
ShowMessage('Error Dispose!');
Dispose(AMethod);end;
//异步传送参数组
procedure TForm1.ProcessFileTransferOutput();
var
Parameters: TStringlist;begin
Parameters:=TStringList.Create; Parameters.Add('1'); //操作类型
Parameters.Add('ProcessFileTransferOutput Ok!'); //操作参数 Asynchronous(self.ProcessFileTransferOutput,Parameters); //异步执行ProcessFileTransferOutput过程end;//处理参数过程
procedure TForm1.ProcessFileTransferOutput(PData:Pointer);
var
Parameters:TStringlist;
begin
Parameters:=PData; case StrToInt(Parameters[0]) of
1: begin
ShowMessage(Parameters[1]);
end; 2: begin end;
end; //这句是不需要了,在ProcessAsynchronous里会释放
Parameters.Free; //这句过后,程序显示Invalid pointer operation对话框,为什么啊??
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Athread:TAThread;
begin
Athread:=TAThread.Create(False);
Athread.Execute;
end;end.