delphi编程:多线程参数传递,收不到返回值,为什么?

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中不显示两个数相加的和。。。问题出在哪儿,如何修正???谢谢。。

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; // 这样就对了,但失去了多线程的意义
温馨提示:答案为网友推荐,仅供参考
delphi编程:多线程参数传递,收不到返回值,为什么?
Createthread(nil, 0, @MyThreadFun, @p, 0, Id); \/\/ 创建线程,注意这里不是阻塞的,启动线程后就直接执行下一句代码了 memo1.Text:=som; \/\/ 执行时上面那个线程可能还没执行结束 你可以理解为,线程中的代码和 memo1这句是同时执行的,所以som的结果并不可预知 thread := Createthread(nil, 0, @MyThreadFun, @p, 0, Id);WaitForSingle...

delphi调用vc的dll的函数不能返回参数??
完全可以VC中的char * 完全可对应delphi的Pchar.function funcXXXX(): Boolean; StdCall ; export;我以前还试过Delphi的DLL函数反回值是一个构造、指针,都可以被VC精确调用。别的涉及字符串时,在Delphi中最好应用定长的字符数组,实袈滟不可再用PChar其它类型我试过float和byte型在VC和delphi中参...

delphi多线程怎么解决数据处理速度跟不上数据接收的速度
1 接收事件触发接收过程,进行数据预处理 我不知道你的预处理是否是必须的,而且必须是在线程处理之前完成,我认为接收事件触发接收过程,收到数据马上放入主线程(也就是我说的线程池管理线程),之后你的进程继续等待下一波数据,而子线程开始处理数据。2 数据预处理后,发出自定义事件或者消息触发数据...

delphi多线程怎么解决数据处理速度跟不上数据接收的速度?
1.每接收一个数据包,创建一个线程去处理。2.解算现成只从池里面取数据:即预处理的数据后,添加到数据池(解算现成可以单个或多个)另外,sleep在线程是中互不影响的,只影响当前线程。

Delphi怎样实现多线程
定义一个函数或者过程,这个函数就是线程要执行的内容,然后调用API就可以不断创建线程,每个线程都单独的执行那个函数,执行完毕线程就自动关闭,下面是我程序里面的部分代码:{下面这个就是线程过程,我的线程传递一个参数,建立的SOCKET} procedure ClientThread(var sock:TSOCKET); stdcall;var ……;beg...

delphi多线程怎样传递多个参数?? 说定义type搞定具体怎么做呢
使用CreateThread的话,使用记录类型就可以传多个参数了.建议楼主在不了解多线程使用方法前使用TThread类操作.!其实很简单的.

请大家解释一下Delphi的回调函数
消息也可以看作是某种形式的回调,因为消息也是在初始化时由调用者向被调用者传递一个句柄和一个消息编号,在约定的事件发生时被调用者向调用者发送消息。这种方式,调用者在主线程中,被调用者在主线程或者工作线程中。Delphi事件模型:在Delphi的VCL中有很多可视化组件都是使用事件模型,例如TForm的On...

关于delphi中的 createthread() 函数传递参数的小问题
;var id: cardinal;begin i:=12000;createthread(nil,0,@test,@i,0,id);end;end.另外还有一点, 使用线程回调函数时一定要加上stdcall,因为默认参数压栈的方式与这个API不兼容.会导致错误.如果只有一个参数或没有参数,就没有问题.在DELPHI使用回调函数时记得在定义处加上stdcall就不会出乱子了.

delphi写得DLL如何像易语言那样返回一串文本??
那个MIT1208说的明显是错误的,菜鸟帮菜鸟,Delphi里面,String是不允许作为返回值的。除非增加了BorlandMM.dll,不过不推荐用String作为返回值。至于为什么,你可以去看看有关String的解释。在dll里面返回String一般是采用内存块返回的方法。procedure returnStr(str:PAnsichar);var s:string;begin s:="返回...

TThread概述
在Windows编程中,Windows SDK文档解释了线程的基本单元为一个名为ThreadFunc的函数,其参数为pointer类型,返回值为integer。这种函数在Delphi中是以TThread类的形式进行封装的。Delphi之所以选择这种封装,是为了提供更为便捷和安全的线程管理方式。TThread类的封装是Delphi为了简化线程的创建、同步和管理。它...

相似回答