关于Delphi中多线程传递参数的简单问题

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;

时间: 2024-12-26 22:04:43

关于Delphi中多线程传递参数的简单问题的相关文章

Delphi中多线程用消息实现VCL数据同步显示

Delphi中多线程用消息实现VCL数据同步显示 Lanno Ckeeke 2006-5-12 概述: delphi中严格区分主线程和子主线程,主线程负责GUI的更新,子线程负责数据运算,当数据运行完毕后,子线程可以向主线程式发送消息,以便通知其将VCL中的数据更新. 实现: 关键在于消息的发送及接收.在消息结构Tmessage中wParam和lParam类型为Longint,而指针类型也定义为Longint,可以通过此指针来传递自己所感兴趣的数据.如传递字符数组: 数组定义: const MA

转载:CI中URI传递参数时,出现:The URI you submitted has disallowed characters.错误。

CI中URI传递参数时,出现:The URI you submitted has disallowed characters.错误.原因:这是由于uri中存在CI不允许的字符. 解决办法: 在config/config.php文件中,找到 复制代码 代码如下: $config['permitted_uri_chars'] = 'a-z 0-9~%.:_/-i'; 在里面添加允许的字符.如我需要添加@符号,则可以这样: 复制代码 代码如下: $config['permitted_uri_chars

js中函数传递参数,究竟是值传递还是引用传递?

记住真理: js函数传递参数,不管是简单数据类型,还是引用数据类型,都是值传递!! 下面是js红包书里面的例子: function setName(obj) { obj.name = "Nicholas"; obj = new Object(); obj.name = "Greg"; } var person = new Object(); setName(person); alert(person.name); // "Nicholas" 肯定

JavaScript中url 传递参数(特殊字符)解决方法

有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.下表中列出了一些URL特殊符号及编码 十六进制值1. + URL 中+号表示空格 %2B2. 空格 URL中的空格可以用+号或者编码 %203. / 分隔目录和子目录 %2F4. ? 分隔实际的 URL 和参数 %3F5. % 指定特殊字符 %256. # 表示书签 %237. & URL 中指定的参数间的分隔符 %268. = URL 中指定参数的值 %3D

LoadRunner lr_eval_string() 函数使用及LR中变量、参数的简单使用

lr_eval_string() 函数的主要作用:返回脚本中的一个参数当前的值, 返回值类型:char 一般多用在调试脚本时输出参数的值.具体用法如下:lr_output_message("The parameter1's value is %s",lr_eval_string("{parameter1}")),其中参数parameter1在之前已经定义了的参数 lr_log_message(lr_eval_string("{parameter1}&quo

setInterval(code, time)中code传递参数办法

1.使用setInterval的场景 有时我们需要隔一定的时间执行一个方法,这时就会用到setInterval,但是由于这个方法是浏览器模拟出的Timer线程,在调用我们方法时不能为其传递参数. 2.setInterval传递参数办法 (1)采用string literals形式 setInterval("interval(param)",1000); 缺点:param必须是全局变量(即window对象上的变量),参数不能被周期性改变 (2)匿名函数包装 window.setInter

多线程传递参数的两种方式

1 带参数的委托方法来传递参数 static void Main(string[] args) { var d = new Data { Message = "中国" }; //通过带参数的委托方法来传递参数 ParameterizedThreadStart var t2 = new Thread(ThreadMainWithParameters); t2.Start(d); System.Console.ReadLine(); } static void ThreadMainWith

Delphi中多线程的技巧

创建线程 MsgThread := TMsgThread.Create(False) ; //创建并执行线程 MsgThread := TMsgThread.Create(True) ; //创建线程后挂起 constructor Create(CreateSuspended: Boolean); 中的参数CreateSuspended表示创建后是否挂起线程. 2)设置线程里没有设置循环执行的话,且设置FreeOnTerminate为True,则线程执行完后就会自己释放. 3)在一个线程结束后,

DELPHI中完成端口(IOCP)的简单分析(2)

今天我写一下关于DELPHI编写完成端口(IOCP)的工作者线程中的东西.希望各位能提出批评意见.上次我写了关于常见IOCP的代码,对于IOCP来说,接受到客户端发送过来和自己发送出去的数据都是从工作者线程中得到.代码和解释如下:function ServerWorkerThread(CompletionPortID:Pointer):Integer;stdcall;begin   CompletionPort:=THANDLE(CompletionPortID);   //得到创建线程是传递过