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. 学好数据结构和算法 —— 线性表

    线性表   线性表表示一种线性结构的数据结构,顾名思义就是数据排成像一条线一样的结构,每个线性表上的数据只有前 […]...

  2. 多列取最大值或者最小值 – Leon_He

    多列取最大值或者最小值 /* lvl1  lvl2    lvl3    lvl4    lvl 4      […]...

  3. 安装Discuz – 白马酒凉

    安装Discuz 1.下载Discuz 版本文件 http://download.comsenz.com/Di […]...

  4. 单片机的存储器 – vi_cc

    单片机的存储器 【转】http://blog.sina.com.cn/s/blog_68f9692f0100j […]...

  5. kubeadm安装k8s

    软件版本: kubelet:V1.13.3 docker: 18.06.1 实验环境: Centos 7.5. […]...

  6. asp.net文件上传下载 – Xproer-松鼠

    asp.net文件上传下载 以ASP.NET Core WebAPI 作后端 API ,用 Vue 构建前端页 […]...

  7. mysql分布式数据库中间件对比 – zhangzongshan

    mysql分布式数据库中间件对比 目前数据库中间件有很多,基本这些中间件在下都有了解和使用,各种中间件优缺点及 […]...

  8. 微信小程序-实现文字跑马灯-wepy – 夜里码码

    微信小程序-实现文字跑马灯-wepy 百度蛮多例子的,但是代码太长懒得看了 前言 要实现跑马灯主要就是获得判断 […]...

随机推荐

  1. 数据分析中,你认为用户行为分析最重要的3个点是什么

    点击流数据记录了用户在网站的几乎所有行为动作,衍生出许多行为指标,有些指标是所有网站都统一的,比如访问频率、平 […]...

  2. Redis的五种数据类型及方法

    字符串string: 字符串类型是Redis中最为基础的数据存储类型,是一个由字节组成的序列,他在Redis中 […]...

  3. U盘启动盘还原

    cmd运行 1 diskpart 2 list disk 3 select disk 1 4 clean 一般 […]...

  4. Java多线程(五):死锁

    死锁 概念 当线程Thread-0持有锁Lock1,Thread-1持有锁Lock2,此时Thread-0申请 […]...

  5. 面试了一个 31岁的iOS开发者,思绪万千,30岁以上的程序员还有哪些出路?

    前言 之前HR给了我一份简历,刚看到简历的第一眼,31岁? 让我有点意外,实际上,现在开发趋向于年轻化,大部分 […]...

  6. Presto性能调优的五大技巧

    概述 Presto架构 Presto是一个分布式的查询引擎,本身并不存储数据,但是可以接入多种数据源,并且支持 […]...

  7. 机器学习(五) 线性回归法 (下)

    六、最好的衡量线性回归法的指标: R Squared   def r2_score(y_true, y_pre […]...

  8. Oracle12c中PL/SQL(DBMS_SQL)新特性之隐式语句结果(DBMS_SQL.RETURN_RESULT and DBMS_SQL.GET_NEXT_RESULT)

    隐式数据结果特性将能简化从其他数据库到Oracle12c存储过程迁移。1. 背景T-SQL中允许查询结果的隐式 […]...

展开目录

目录导航