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;

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

  1. Delphi 中多线程同步的一些处理方法

    Delphi 中多线程同步的一些处理方法   当创建了多个线程,并且多个线程都要访问同一资源,,就有可能出现混乱,于是用Synchronize来控制,使同一时间只有一个线程使用那部分资源,Synchr ...

  2. Delphi过程函数传递参数的几种方式

    Delphi过程函数传递参数的几种方式  在Delphi过程.函数中传递参数几个修饰符为Const.Var.Out. 另一种不加修饰符的为默认按值传递参数. 一.默认方式以值方式传递参数 proced ...

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

    DELPHI中完成端口(IOCP)的简单分析(2)   今天我写一下关于DELPHI编写完成端口(IOCP)的工作者线程中的东西.希望各位能提出批评意见.上次我写了关于常见IOCP的代码,对于IOCP ...

  4. 深入理解python中函数传递参数是值传递还是引用传递

    深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是"传对象引用 ...

  5. DELPHI中完成端口(IOCP)的简单分析(4)

    DELPHI中完成端口(IOCP)的简单分析(4)   在我以前写的文章中,一直说的是如何接收数据.但是对于如何发送数据却一点也没有提到.因为从代码量上来说接收的代码要比发送多很多.今天我就来写一下如 ...

  6. DELPHI中完成端口(IOCP)的简单分析(3)

    DELPHI中完成端口(IOCP)的简单分析(3)   fxh7622关注4人评论7366人阅读2007-01-17 11:18:24   最近太忙,所以没有机会来写IOCP的后续文章.今天好不容易有 ...

  7. DELPHI中完成端口(IOCP)的简单分析(1)

    DELPHI中完成端口(IOCP)的简单分析(1)   用DELPHI开发网络代码已经有一段时间了! 我发现在网上用VC来实现完成端口(IOCP)的代码很多,但是使用DELPHI来实现的就比较少了.对 ...

  8. Python中函数传递参数有四种形式

    Python中函数传递参数有四种形式 fun1(a,b,c) fun2(a=1,b=2,c=3) fun3(*args) fun4(**kargs) 四种中最常见是前两种,基本上一般点的教程都会涉及, ...

  9. DELPHI中多线程知识【转】

    本文的内容取自网络,并重新加以整理,在此留存仅仅是方便自己学习和查阅.所有代码均亲自测试 delphi7下测试有效.图片均为自己制作. 多线程应该是编程工作者的基础技能, 但这个基础我从来没学过,所以 ...

随机推荐

  1. osx下配置Cocos2d-x 3.x Android开发环境

    配置前需要准备的 首先需要看一下官网文档 http://www.cocos.com/doc/article/index?type=cocos2d-x&url=/doc/cocos-docs-m ...

  2. label标签使用过程中遇到的问题

    最近在做东西时候使用到了label标签,由于之前很少使用label标签,所以就遇到一个很奇怪的问题.什么问题呢?下面来看一个效果 <!DOCTYPE html> <html> ...

  3. IO:InputStream

    InputStream类(java.io.InputStream) public abstract class InputStream extends Object implements Closea ...

  4. TCP/IP BOOKS

    TCP/IP Fundamentals for Microsoft Windows: Overview https://technet.microsoft.com/en-us/library/bb72 ...

  5. 转:linux lsof命令详解

    简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控 ...

  6. Servlet访问第一次500,刷新后404的解决办法

    第一次运行错误:HTTP Status 500 -  --------------------------------------------type Exception reportmessage  ...

  7. mybatis 与 缓存

    首先从配置文件说起,有个cacheEnabled的配置项,当设置为true时(默认就是true),Session就会用一个CachingExecutor来包装我们的Executor实例: public ...

  8. 调试腾讯微博 win8 版 共享失败的问题

    我是社交控,喜欢分享内容.分享到 腾讯微博时总失败,心想不能就这么算了,要看看异常的细节. 在VS 2012里,我选择 Debug > Debug Installed App Package, ...

  9. windows 自带的 端口映射 端口转向功能

    安装IPV6 netsh interface ipv6 install查看 netsh interface portproxy show all添加 netsh interface portproxy ...

  10. python3.5学习笔记--利用字典对指定文本字符串进行替换

    事情缘起于同事整理excel,需要批量的对某一列的内容进行替换. 举例: 数据格式:以下为一列内容,每行都在一个单元格中,目的是将数字替换为制定的中文字符. 1,2,31 ,4,33 ,21,, 对于 ...