在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
http://bbs.csdn.net/topics/390513469/ unit uThread; interface uses Classes; type Th = class(TThread) private { Private declarations } protected procedure Execute; override; end; 以上是创建的一个多线程 function Myfun(username,password:string):boolean 现在要把Myfun放到多线程里执行,怎么传递参数呢? 解决方法如下: // 线程类 unit Unit2; interface uses 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; implementation function 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; interface uses 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: unit Unit2; interface uses 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; implementation procedure 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; 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 UserName: string read FUserName write GetUserName; |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论