关于delphi中的 createthread() 函数传递参数的小问题
我自己定义了一个叫test的函数,functiontest(vari:integer)boolean;beginform1.edit1.text:=inttostr(i)...
我自己定义了一个叫 test 的函数,function test (var i:integer) boolean;begin form1.edit1.text := inttostr ( i ); end; //我知道用不着多线程,,我做测试而已,.将要用到的----我在一个按钮单击事件中写下i := 100 ; // i 是 integer 型createthread(nil, 0, @test, @i, 0, ID );问题就是这个 参数 i 好像传递不过去,总是报错,--请修改一下我上面的代码,,看看哪里有错误或者写一个用 多线程传递参数 的简单例子,
展开
1个回答
2013-09-09
展开全部
这种情况可能是i 变量定义在createthread(nil, 0, @test, @i, 0, ID ); 这句代码的过程里了.比如procedure proc;var i: integer;begin i:=100; //由于i是局部变量,所以在下边这一句结束后,局部变量的存在期就结束了 //换句话说,传过程后就产生野指针了. createthread(nil, 0, @test, @i, 0, ID ); end;正确的做法就是把 i 变量定义成全部变量如下: unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
i: Integer;implementation{$R *.dfm}function test (var i:integer): boolean; stdcall;
begin
form1.edit1.text := inttostr (i);
result:=true;
end;procedure TForm1.Button1Click(Sender: TObject);
var
id: cardinal;
begin
i:=12000;
createthread(nil,0,@test,@i,0,id);
end;end.
另外还有一点, 使用线程回调函数时一定要加上stdcall,因为默认参数压栈的方式与这个API不兼容.会导致错误.如果只有一个参数或没有参数,就没有问题.在DELPHI使用回调函数时记得在定义处加上stdcall就不会出乱子了.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
i: Integer;implementation{$R *.dfm}function test (var i:integer): boolean; stdcall;
begin
form1.edit1.text := inttostr (i);
result:=true;
end;procedure TForm1.Button1Click(Sender: TObject);
var
id: cardinal;
begin
i:=12000;
createthread(nil,0,@test,@i,0,id);
end;end.
另外还有一点, 使用线程回调函数时一定要加上stdcall,因为默认参数压栈的方式与这个API不兼容.会导致错误.如果只有一个参数或没有参数,就没有问题.在DELPHI使用回调函数时记得在定义处加上stdcall就不会出乱子了.
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询