关于Delphi中多线程传递参数的简单问题
2016-04-24 23:38
549 查看
http://bbs.csdn.net/topics/390513469/
以上是创建的一个多线程
我在另外一个单元里Unit1有一个函数
现在要把Myfun放到多线程里执行,怎么传递参数呢?
谁有这样的Demo给一个我,帮我讲解一下,感激不尽!我看到网上说有结构体,因本人才学Delphi没多久,不太懂的,希望大牛们指点迷津!
解决方法如下:
function Myfun(FUserName, FPassWord: string): Boolean; 这行上面加个 private:
这个函数没必要 也不应该public。
另外注意,如果线程中涉及操作UI,就把操作UI的代码放到Synchronize中执行
例如:
传递函数指针,以回调的形式调用
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;
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;
相关文章推荐
- delphi 提取字符中的数字
- [iOS] Delphi for iOS 版本需求
- Delphi安装组件的几种方式
- delphi 基础书籍推荐
- Delphi加密组件TurboPower Lockbox
- Delphi命令行输出组件DOSCommand及Widnows 命令解释使用说明
- 相当无聊之Delphi截取字符串123-456-7,得到123,456,7
- 死亡历险,DELPHI以string方式传递图片到JAVA的WEBSERVICE保存
- 死亡历险,DELPHI以TByteDynArray(Bytes)方式传递图片到JAVA的WEBSERVICE保存
- RAD Studio, Delphi and C++Builder 10.1 Berlin 新版本功能介绍 - 首场在线教学
- Delphi快捷键
- delphi学习_安装
- delphi TClientDataSet 保存到XML
- delphi 编码速度提升技能
- [Delphi] Search path vs Library Path vs Browsing Path
- delphi 接口Interface
- DELPHI MAKEWORD的用法
- delphi absolute 应用实例
- Delphi常见错误及解决方法
- Delphi 调用C#编写的WebService 参数为Null解决方法