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

zyb2016 2021-08-13 原文


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

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. 使用ASP.NET Core 3.x 构建 RESTful API – 4.3 HTTP 方法的安全性和幂等性

    什么样的HTTP方法是安全的?  如果一个方法不会该表资源的表述,那么这个方法就被认为是安全的。  例如 HT […]...

  2. java高并发编程基础之AQS – java金融

    java高并发编程基础之AQS 引言 曾经有一道比较比较经典的面试题“你能够说说java的并发包下面有哪些常见 […]...

  3. Excel教程(13) – 统计函数

    AVEDEV 用途:返回一组数据与其平均值的绝对偏差的平均值,该 函数可以评测数据(例如学生的某科考试成绩)的 […]...

  4. 『言善信』Fiddler工具 — 16、使用Fiddler抓取移动端App请求

    目录 1、抓取Android移动端App请求 2、抓取IOS移动端App请求 3、总结: 1、抓取Androi […]...

  5. flask中单选、多选、下拉框的获取 – 小陆同学

    flask中单选、多选、下拉框的获取 前端网页向后端接口传递参数的方式有哪些?flask框架如何获取参数的呢? […]...

  6. python安装文件中—Scripts文件夹中没有文件目录(空白) – AndaPython

    python安装文件中—Scripts文件夹中没有文件目录(空白) 本人小白一个,初学python一个月,刚看 […]...

  7. Github入门 – Github基本使用及Github桌面版使用

    知识内容: 1.版本控制 2.Git介绍 3.Github介绍及基本使用 4.Github桌面版介绍及安装 5 […]...

  8. CUBA平台使用感想 – 架构师角度

    使用CUBA.Platform快要有一年了,从最初的难以理解和比较抵触,到现在真的有点喜欢这个框架,中间也确实 […]...

随机推荐

  1. 编程书籍分享–pdf

    作为程序员,我觉得我们应该多学习、多思考、多分享。  今天就花费了一点时间把这几年搜集的编程资料上传到了网上做 […]...

  2. Virglass带给我们的虚拟现实的世界很大,我想去走走”

    2015年Unity大会将在北京召开,依托全球领先开发平台Unity在中国成功打造的包含游戏及应用开发、虚拟现 […]...

  3. 说说babel

    一.什么是babel 二.如何配置 三.配置babel-polyfill   一.什么是babel The c […]...

  4. TestFlight使用方法

    1 说明 目前IOS版本APP上架前,很少有项目对上架包进行测试,而上架包是人工打包的,很有可能之前的测试包没 […]...

  5. 802.11r协议理解

    首先阅读了相关协议内容整理出了如下的802.11r时序图所谓基础,然后会详细理解其中的每一个步骤:...

  6. CSS 了解一下

    CSS 认识一下 1、CSS 的那些事 CSS(Cascading Style Sheets)译「层叠样式表」 […]...

  7. EasyUI Datagrid 导出到Excel (不含frozenColumns列)

    1 var tableString = \'<table border="1" bordercolor= […]...

  8. nginx

    一、Nginx简介 ​ Nginx(发音同engine x)是一个异步框架的 Web服务器,也可以用作反向代理 […]...

展开目录

目录导航