delphi编程:多线程参数传递,收不到返回值,为什么?
unitUnit1;interfaceusesWindows,Messages,SysUtils,Variants,Classes,Graphics,Controls,F...
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Test=record
a: Integer;
b: Integer;
end;
var
Form1: TForm1;
implementation
var
som:string; //全局变量
{$R *.dfm}
procedure MyThreadFun(var Pa: Test); stdcall;
begin
som := IntToStr(Pa.a+Pa.b);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Id: Dword;
P: test;
begin
som:=''; //全局变量清空
p.a:=5000;
p.b:=1000;
Createthread(nil, 0, @MyThreadFun, @p, 0, Id);
memo1.Text:=som;
end;
end.
正在学习线程,调试一个程序,程序能运行,但是memo1中不显示两个数相加的和。。。问题出在哪儿,如何修正???谢谢。。 展开
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Test=record
a: Integer;
b: Integer;
end;
var
Form1: TForm1;
implementation
var
som:string; //全局变量
{$R *.dfm}
procedure MyThreadFun(var Pa: Test); stdcall;
begin
som := IntToStr(Pa.a+Pa.b);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Id: Dword;
P: test;
begin
som:=''; //全局变量清空
p.a:=5000;
p.b:=1000;
Createthread(nil, 0, @MyThreadFun, @p, 0, Id);
memo1.Text:=som;
end;
end.
正在学习线程,调试一个程序,程序能运行,但是memo1中不显示两个数相加的和。。。问题出在哪儿,如何修正???谢谢。。 展开
1个回答
展开全部
Createthread(nil, 0, @MyThreadFun, @p, 0, Id); // 创建线程,注意这里不是阻塞的,启动线程后就直接执行下一句代码了
memo1.Text:=som; // 执行时上面那个线程可能还没执行结束
你可以理解为,线程中的代码和 memo1这句是同时执行的,所以som的结果并不可预知
thread := Createthread(nil, 0, @MyThreadFun, @p, 0, Id);
WaitForSingleObject(thread) // 等待线程执行结束
memo1.Text:=som; // 这样就对了,但失去了多线程的意义
memo1.Text:=som; // 执行时上面那个线程可能还没执行结束
你可以理解为,线程中的代码和 memo1这句是同时执行的,所以som的结果并不可预知
thread := Createthread(nil, 0, @MyThreadFun, @p, 0, Id);
WaitForSingleObject(thread) // 等待线程执行结束
memo1.Text:=som; // 这样就对了,但失去了多线程的意义
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询