16,748
社区成员
发帖
与我相关
我的任务
分享
unit uThread;
interface
uses
Classes;
type
Th = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
以上是创建的一个多线程function Myfun(username,password:string):boolean
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;
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.
// 线程类
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.