http://bbs.csdn.net/topics/390513469/
unit uThread; interface uses Classes; type Th = class(TThread) private { Private declarations } protected procedure Execute; override; end;
以上是創建的一個多線程
我在另外一個單元里Unit1有一個函數
function Myfun(username,password:string):boolean
現在要把Myfun放到多線程里執行,怎么傳遞參數呢?
誰有這樣的Demo給一個我,幫我講解一下,感激不盡!我看到網上說有結構體,因本人才學Delphi沒多久,不太懂的,希望大牛們指點迷津!
解決方法如下:
// 線程類 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:
這個函數沒必要 也不應該public。
另外注意,如果線程中涉及操作UI,就把操作UI的代碼放到Synchronize中執行
例如:
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;
property PassWord: string read FPassWord write GetPassWord;
名字都給弄錯了,SetUserName、SetPassWord
property UserName: string read FUserName write SetUserName;
property PassWord: string read FPassWord write SetPassWord;