关于Delphi中多线程传递参数的简单问题 本帖最后由 kindao2 于 2013-07-09 21:38:25 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 把 Myfun 函数定义在uThread中走位成员函数 把 Myfun 函数定义在uThread中作为成员函数 // 线程类unit Unit2;interfaceuses Classes;type TMyThread = class(TThread) private FUserName: string; FPassWord: string; FFlag: Boolean; procedure GetUserName(const Value: string); procedure GetPassWord(const Value: string); { Private declarations } protected procedure Execute; override; public property UserName: string read FUserName write GetUserName; property PassWord: string read FPassWord write GetPassWord; property MyFunRetVal: Boolean read FFlag default False; function Myfun(FUserName, FPassWord: string): Boolean; constructor Create(b: Boolean = True); end;implementationfunction TMyThread.Myfun(FUserName, FPassWord: string): Boolean;begin Result := True; // 简单起见让它固定为Trueend;constructor TMyThread.Create(b: Boolean = True);begin inherited Create(b); Self.FreeOnTerminate := True;end;procedure TMyThread.Execute;begin FFlag := Myfun(FUserName, FPassWord);end;procedure TMyThread.GetPassWord(const Value: string);begin FPassWord := Value;end;procedure TMyThread.GetUserName(const Value: string);begin FUserName := Value;end;end.// 调用单元unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) btn1: TButton; procedure btn1Click(Sender: TObject); private public procedure MyOnTerminate(Sender: TObject); end;var Form1: TForm1;implementation{$R *.dfm}uses Unit2; // 线程类定义在unit2单元var retVal: Boolean; // 线程"返回值"procedure TForm1.btn1Click(Sender: TObject);var myThread: TMyThread;begin myThread := TMyThread.Create; // 创建线程并挂起 myThread.UserName := 'sololie'; // 传参 myThread.PassWord := '撸过更健康'; myThread.OnTerminate := MyOnTerminate; // 线程结束的回调函数 myThread.Resume; // 开始执行线程end;procedure TForm1.MyOnTerminate(Sender: TObject);begin retVal := (Sender as TMyThread).MyFunRetVal; if retVal then ShowMessage('线程执行函数返回 True') else ShowMessage('线程执行函数返回 False');end;end. function Myfun(FUserName, FPassWord: string): Boolean; 这行上面加个 private:这个函数没必要 也不应该public。另外注意,如果线程中涉及操作UI,就把操作UI的代码放到Synchronize中执行例如:unit Unit2;interfaceuses Classes;type TMyThread = class(TThread) private FUserName: string; FPassWord: string; FFlag: Boolean; procedure GetUserName(const Value: string); procedure GetPassWord(const Value: string); procedure Myfun; // 原本的参数传递交由 TMyThread的实例赋值完成 protected procedure Execute; override; public property UserName: string read FUserName write GetUserName; property PassWord: string read FPassWord write GetPassWord; property MyFunRetVal: Boolean read FFlag default False; constructor Create(b: Boolean = True); end;implementationprocedure TMyThread.Myfun;begin // 假设这里做了操作UI的工作 FFlag := True;end;constructor TMyThread.Create(b: Boolean = True);begin inherited Create(b); Self.FreeOnTerminate := True;end;procedure TMyThread.Execute;begin // 让操作UI的代码放回主线程中执行已保证同步 Synchronize(Myfun);end;procedure TMyThread.GetPassWord(const Value: string);begin FPassWord := Value;end;procedure TMyThread.GetUserName(const Value: string);begin FUserName := Value;end;end. 传递函数指针,以回调的形式调用type TMyFunc = function(username,password:string):boolean;stdcall; Th = class(TThread) private { Private declarations } FMyFunc : pointer; protected procedure Execute; override; public Procedure SetMyFunc(func : pointer); end;implementationprocedure Th.Execute;begin if assigned(FMyFunc) then TMyFunc(FMyFunc)(username,password);end;procedure Th.SetMyFunc(func : pointer); begin FMyFunc := func;end;//在其它地方定义一个函数,比如function MyFunc(username,password) :boolean;stdcall;begin //end;procedure TForm1.btn1Click(Sender: TObject); var myThread: TMyThread;begin myThread := TMyThread.Create(false); myThread.SetMyFunc(@MyFunc); end; property UserName: string read FUserName write GetUserName; property PassWord: string read FPassWord write GetPassWord;名字都给弄错了,SetUserName、SetPassWord property UserName: string read FUserName write SetUserName; property PassWord: string read FPassWord write SetPassWord; 弹出框,做导航菜单的 干宝宝生日,两周岁了 zeoslib(zeosDBO) 如何动态指定Access(mdb)数据库 求查询及操作ARP表的源代码. 如何在一张图片上,用户可以以不规则的闭合的线条将地图划分成若干的块,其中闭合的区域范围内是个热区,用户点击这个热区系统会弹出提示 请教一个菜单的问题? 请问DBImage控件可以显示jpg格式的图像吗 高手请进 谁能提供大学的自动排课系统,RMB重酬! delphi7编译的程序 win7兼容模式运行 首次慢 退出后 再进 速度很快。 想要个 图文编辑器,就是混合了图片和文字的编辑器,有没有现成的? CHART组件求助
// 线程类
unit Unit2;interfaceuses
Classes;type
TMyThread = class(TThread)
private
FUserName: string;
FPassWord: string;
FFlag: Boolean;
procedure GetUserName(const Value: string);
procedure GetPassWord(const Value: string);
{ Private declarations }
protected
procedure Execute; override;
public
property UserName: string read FUserName write GetUserName;
property PassWord: string read FPassWord write GetPassWord;
property MyFunRetVal: Boolean read FFlag default False;
function Myfun(FUserName, FPassWord: string): Boolean;
constructor Create(b: Boolean = True);
end;implementationfunction TMyThread.Myfun(FUserName, FPassWord: string): Boolean;
begin
Result := True; // 简单起见让它固定为True
end;constructor TMyThread.Create(b: Boolean = True);
begin
inherited Create(b);
Self.FreeOnTerminate := True;
end;procedure TMyThread.Execute;
begin
FFlag := Myfun(FUserName, FPassWord);
end;procedure TMyThread.GetPassWord(const Value: string);
begin
FPassWord := Value;
end;procedure TMyThread.GetUserName(const Value: string);
begin
FUserName := Value;
end;end.// 调用单元
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
public
procedure MyOnTerminate(Sender: TObject);
end;var
Form1: TForm1;implementation{$R *.dfm}uses Unit2; // 线程类定义在unit2单元var
retVal: Boolean; // 线程"返回值"procedure TForm1.btn1Click(Sender: TObject);
var
myThread: TMyThread;
begin
myThread := TMyThread.Create; // 创建线程并挂起
myThread.UserName := 'sololie'; // 传参
myThread.PassWord := '撸过更健康';
myThread.OnTerminate := MyOnTerminate; // 线程结束的回调函数
myThread.Resume; // 开始执行线程
end;procedure TForm1.MyOnTerminate(Sender: TObject);
begin
retVal := (Sender as TMyThread).MyFunRetVal;
if retVal then
ShowMessage('线程执行函数返回 True')
else
ShowMessage('线程执行函数返回 False');
end;end.
这个函数没必要 也不应该public。另外注意,如果线程中涉及操作UI,就把操作UI的代码放到Synchronize中执行例如:unit Unit2;interfaceuses
Classes;type
TMyThread = class(TThread)
private
FUserName: string;
FPassWord: string;
FFlag: Boolean;
procedure GetUserName(const Value: string);
procedure GetPassWord(const Value: string); procedure Myfun; // 原本的参数传递交由 TMyThread的实例赋值完成
protected
procedure Execute; override;
public
property UserName: string read FUserName write GetUserName;
property PassWord: string read FPassWord write GetPassWord;
property MyFunRetVal: Boolean read FFlag default False;
constructor Create(b: Boolean = True);
end;implementationprocedure TMyThread.Myfun;
begin
// 假设这里做了操作UI的工作
FFlag := True;
end;constructor TMyThread.Create(b: Boolean = True);
begin
inherited Create(b);
Self.FreeOnTerminate := True;
end;procedure TMyThread.Execute;
begin
// 让操作UI的代码放回主线程中执行已保证同步
Synchronize(Myfun);
end;procedure TMyThread.GetPassWord(const Value: string);
begin
FPassWord := Value;
end;procedure TMyThread.GetUserName(const Value: string);
begin
FUserName := Value;
end;end.
TMyFunc = function(username,password:string):boolean;stdcall;
Th = class(TThread)
private { Private declarations }
FMyFunc : pointer;
protected
procedure Execute; override;
public
Procedure SetMyFunc(func : pointer);
end;
implementation
procedure Th.Execute;
begin
if assigned(FMyFunc) then TMyFunc(FMyFunc)(username,password);
end;procedure Th.SetMyFunc(func : pointer);
begin
FMyFunc := func;
end;//在其它地方定义一个函数,比如
function MyFunc(username,password) :boolean;stdcall;
begin
//
end;procedure TForm1.btn1Click(Sender: TObject);
var myThread: TMyThread;
begin
myThread := TMyThread.Create(false);
myThread.SetMyFunc(@MyFunc);
end;
property PassWord: string read FPassWord write GetPassWord;名字都给弄错了,SetUserName、SetPassWord
property UserName: string read FUserName write SetUserName;
property PassWord: string read FPassWord write SetPassWord;