Delphi另一个多线程函数:BeginThread用法 - zyb2016

zyb2016 2021-08-13 原文

Delphi另一个多线程函数:BeginThread
━━━━━━━━━━━━━━━━━━━━━━━━━━

Delphi也提供了一个相同功能的类似函数:
function BeginThread(
    SecurityAttributes: Pointer; 
    StackSize: LongWord; 
    ThreadFunc: TThreadFunc; 
    Parameter: Pointer; 
    CreationFlags: LongWord; 
    var ThreadId: LongWord
): Integer;
━━━━━━━━━━━━━━━━━━━━━━━━━━
FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID);
这里就用到了前面说到的Delphi RTL函数BeginThread,它有很多参数,关键的是第三、四两个参数。
第三个参数就是前面说到的线程函数,即在线程中执行的代码部分。
第四个参数则是传递给线程函数的参数,在这里就是创建的线程对象(即Self)。
第五个是用于设置线程在创建后即挂起,不立即执行(启动线程的工作是在AfterConstruction中根据CreateSuspended标志来决定的),
第六个是返回线程ID。

━━━━━━━━━━━━━━━━━━━━━━━━━━
定义被BeginThread调用的函数
━━━━━━━━━━━━━━━━━━━━━━━━━━

声明:type TThreadFunc : Function(Parameter : Pointer) : Integer;

描述:TThreadFunc定义了一个函数而不是数据。这个函数通常作为BeginThread函数的一个参数,BeginThread是一个单独的线程运行时开始的。这个定义的TThreadFunc函数实现了线程的行为。

函数的返回代码是线程的退出代码。

uses
Forms, Dialogs, Windows, SysUtils;

type
TMsgRecord = record
    thread : Integer;
    msg    : string[30];
end;
TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
end;

var
Form1: TForm1;

Implementation
{$R *.dfm}        // 包含窗体定义

ThreadVar         // 必须允许每个线程有被传递增的记录变量的实例

msgPtr : ^TMsgRecord;

// 私有的线程过程,用于显示字符串
function ShowMsg(Parameter : Pointer) : Integer;
begin
// 设返回值为0
Result := 0;

// 映射指针到被传递进来的参数
// 每个线程有一份独立的msgPtr副本
msgPtr := Parameter;

// 在指定坐标显示对话框
ShowMessagePos(\’Thread \’+IntToStr(msgPtr.thread)+\’ \’+msgPtr.msg,
                 200*msgPtr.thread, 100);

// 结束线程
EndThread(0);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
id1, id2 : LongWord;
thread1, thread2 : Integer;
msg1, msg2 : TMsgRecord;
showMsgFunc : TThreadFunc;

begin
// 指定线程函数地址
showMsgFunc := Addr(ShowMsg);

//初始化要显示的
msg1.thread := 1;
msg1.msg    := \’Hello World\’;
msg2.thread := 2;
msg2.msg    := \’Goodbye World\’;

// 开始第一个线程
thread1 := BeginThread(nil,
                         0,
                         showMsgFunc,
                         Addr(msg1),
                         0,
                         id1);

// 开始第二个线程
thread2 := BeginThread(nil,
                         0,
                         showMsgFunc,
                         Addr(msg2),
                         0,
                         id2);

// 确保线程关闭前,线程应执行完成
ShowMessagePos(\’Press this when other dialogs finished.\’, 200, 300);

// 最后关闭线程
CloseHandle(thread1);
CloseHandle(thread2);
end;
end.

程序运行结果,显示3个对话框:
Thread 1 Hello World
Thread 2 Goodbye World
Press this when other dialogs finished.

 

转自https://www.xuebuyuan.com/467050.html

发表于
2019-07-08 16:16 
zyb2016 
阅读(1252
评论(0
编辑 
收藏 
举报

 

版权声明:本文为zyb2016原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zyb2016/p/11151918.html

Delphi另一个多线程函数:BeginThread用法 - zyb2016的更多相关文章

  1. 简要说明一下offsetWidth的替换 – 愚小子

    简要说明一下offsetWidth的替换    前面几个例子中用到了offsetWidth这个属性,其实还有o […]...

  2. Thread.join() – shumeigang

    Thread.join() 为什么要用join()方法 如果子线程里要进行大量的耗时的运算,主线程往往将于子线 […]...

  3. activiti整合在现有系统,业务绑定,流程在线设计@附源码 – 金陵老街

    activiti整合在现有系统,业务绑定,流程在线设计@附源码 前言 目前市场上有很多开源平台没有整合工作流, […]...

  4. [转载]如何为自己的网站设置二级域名? – RobotTech

    [转载]如何为自己的网站设置二级域名? /* written by Jaron ,2004-08-03 *// […]...

  5. 使用比特币轻量钱包Electrum – sky_cheng

    使用比特币轻量钱包Electrum 一、选择对应的钱包安装程序 浏览器打开 https://electrum. […]...

  6. SpringCloud Sleuth + Zipkin 实现链路追踪

    一、Sleuth介绍     为什么要使用微服务跟踪? 它解决了什么问题? 1.微服务的现状?   随着业务的 […]...

  7. php生成微信小程序二维码源码 – 壹度技术

    php生成微信小程序二维码源码 目前有3个接口可以生成小程序码,开发者可以根据自己的需要选择合适的接口。第一步 […]...

  8. Windows Service 开发,安装与调试 – 程序员最后都要送外卖

    Windows Service 开发,安装与调试 Visual Studio.net 2010 Windows […]...

随机推荐

  1. 网络经济与企业管理(第3章:客户关系管理)

    经营理念更新的需要——企业经营的基本理念 是随着市场环境的变化而不断演变的。 一、客户关系管理概述 客户关系管 […]...

  2. 如何完全卸载 mysql 数据库

    有时候MySQL不能完全卸载,这时候必须通过一些途径删除掉注册表和一些残余的文件,然后才能重新安装才可以成功! […]...

  3. 十六进制颜色转换ARGB/RGB

    开发中,我们用的的颜色都是不是 百分之百纯色 ,UI 可能会说,这个颜色(0x FFFFFF) 20%,那个颜 […]...

  4. 【HTB系列】靶机Querier的渗透测试

    出品|MS08067实验室(www.ms08067.com) 本文作者:大方子(Ms08067实验室核心成员) […]...

  5. H5和安卓原生进行交互的操作流程记录 – 人鱼之森

    H5和安卓原生进行交互的操作流程记录 本人只是一个前端,第一次接触和移动端的混合开发,遇到了一些问题,现在记录 […]...

  6. word格式刷小技巧

    word格式刷小技巧 1.单击“格式刷”按钮,使用一次后,按钮将自动弹起,不能继续使用;如要连续多次使用,可双 […]...

  7. 表格自动换行 – 不爱熬夜

    表格自动换行 在table中加入样式 style=”table-layout:fixed; wor […]...

  8. 「HTML+CSS」–自定义加载动画【010】

    前言 Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ 哈哈 自我介绍一 […]...