还是beginthread传递参数问题

warcow 2015-07-18 02:12:57
问题:用beginthread创建一个线程,想传递一个参数,但在线程里总是不能读出我传递的参数值。
很多年没用过delphi了,这次试下delphi xe7,碰到了这问题,不知道是哪里出的错,请各位指点一下。感谢!
线程函数:

procedure mythread(pi:pinteger);stdcall;
var
i:integer;
begin
i:=pi^; //这里i是一个随机数,总是不能得到我传递过来的数值
showmessage(inttostr(i));
end;

创建线程:

procedure TMainForm.Button1Click(Sender: TObject);
var
hThread:Thandle;
ThreadID:DWord;
//pi:pinteger; //看到网上说有可能是局部变量的问题,我就把这pi改成全局变量了,还是不能解决问题
begin
new(pi);
pi^:=1;
hthread:=BeginThread(nil,0,@mythread,pi,0,ThreadID);
if hThread=0 then
begin
messagebox(Handle,'创建线程失败!',nil,MB_OK);
end;
end;

...全文
1234 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathletboy 2015-07-20
  • 打赏
  • 举报
回复
引用 2 楼 warcow 的回复:
确实是这样,去掉stdcall就可以了,谢谢,马上给分,不过我不知道其中的原理,能不能麻烦解释一下。 [quote=引用 1 楼 pathletboy 的回复:]
procedure mythread(pi:pinteger);stdcall;
procedure mythread(pi:pinteger);
[/quote] 参数类型要匹配,先看定义。
function BeginThread(SecurityAttributes: Pointer; StackSize: LongWord; ThreadFunc: TThreadFunc; Parameter: Pointer; CreationFlags: LongWord; var ThreadId: LongWord): Integer;
TThreadFunc = function (Parameter: Pointer): Integer;
也就是线程函数调用约定是默认的pascal方式,不是stdcall方式。
warcow 2015-07-18
  • 打赏
  • 举报
回复
确实是这样,去掉stdcall就可以了,谢谢,马上给分,不过我不知道其中的原理,能不能麻烦解释一下。
引用 1 楼 pathletboy 的回复:
procedure mythread(pi:pinteger);stdcall;
procedure mythread(pi:pinteger);
pathletboy 2015-07-18
  • 打赏
  • 举报
回复
procedure mythread(pi:pinteger);stdcall;
procedure mythread(pi:pinteger);

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧