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

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

  1. delphi的一个公用函数库

    delphi的一个公用函数库 {********************************************** ***  Name: PublicFunc; ***  Author: l ...

  2. Delphi中 StrToIntDef函数的用法

    Delphi中 StrToIntDef函数的用法:比如我要判断一个文本框里输入的字符串能不能转换为integer类型,如果能,则返回转换后的整型数据,如果不能,则返回整数0,那么我就可以用strtoi ...

  3. delphi中Application.MessageBox函数用法详解

    delphi中Application.MessageBox函数用法详解 Application.MessageBox是TApplication的成员函数,声明如下:functionTApplicati ...

  4. 教程-Delphi中Spcomm使用属性及用法详解

    Delphi中Spcomm使用属性及用法详解 Delphi是一种具有 功能强大.简便易用和代码执行速度快等优点的可视化快速应用开发工具,它在构架企业信息系统方面发挥着越来越重要的作用,许多程序员愿意选 ...

  5. c#初学-多线程中lock用法的经典实例

    本文转载自:http://www.cnblogs.com/promise-7/articles/2354077.html 一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被 ...

  6. 多线程中lock用法的经典实例

    多线程中lock用法的经典实例 一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.它可以把一段代码定义为互斥段(critical section),互斥段在一 ...

  7. MFC多线程各种线程用法 .

    http://blog.csdn.net/qq61394323/article/details/9328301 一.问题的提出 编写一个耗时的单线程程序: 新建一个基于对话框的应用程序SingleTh ...

  8. C++多线程2.beginthread

    C++ 多线程2 beginthread 启动线程知识 20131021 Reference: http://blog.csdn.net/laoyang360/article/details/7720 ...

  9. 由一个多线程共享Integer类变量问题引起的。。。

    最近看到一个多线程面试题,有三个线程分别打印A.B.C,请用多线程编程实现,在屏幕上循环打印10次ABCABC- 看到这个题目,首先想到的是解决方法是定义一个Integer类对象,初始化为0,由3个线 ...

随机推荐

  1. day1-2基本数据类型

    /*5种基本数据类型 1,Undefined var a; a = undefined Undefined派生自Null 2,Null(本质属于object,单独细分出来的) var a = null ...

  2. Python的常用库

    读者您好.今天我将介绍20个属于我常用工具的Python库,我相信你看完之后也会觉得离不开它们.他们是: Requests.Kenneth Reitz写的最富盛名的http库.每个Python程序员都 ...

  3. Django manager 命令笔记

    1. 新建app startapp your_app_name 2. 删除app migrate your_app_name zero 此外还需要删除整个App文件夹,并在settings.py的In ...

  4. 题解 JSOI2010 找零钱的洁癖

    题解 JSOI2010 找零钱的洁癖 题面 BZOJ 个人体会 van全没有思路... 只能去看题解... 还是个bfs+贪心 不管怎样竟然乱搞过了... 听M_sea小姐姐说她有更正经的做法(线性规 ...

  5. nmap 速查命令

    进行ping扫描,打印出对扫描做出响应的主机,不做进一步测试(如端口扫描或者操作系统探测) nmap -sP 192.168.1.0/24 仅列出指定网络上的每台主机,不发送任何报文到目标主机 nam ...

  6. 绕过waf

    WAF:有硬件和软件类型. 常见的软WAF,常见:安全狗.云锁.云盾.护卫神. SQL注入的绕过:  WAF核心机制就是正则匹配. 通过正则匹配,如果符合规则,就拦截. 比如sql注入中and 1=1 ...

  7. Kali环境使用Metasploit生成木马入侵安卓手机

    Metasploit是一款开源的安全漏洞检测工具,可以帮助安全和IT专业人士识别安全性问题,验证漏洞的缓解措施,并管理专家驱动的安全性进行评估,提供真正的安全风险情报.这些功能包括智能开发,代码审计, ...

  8. 学习打卡8:循环语句for、while

    流程图: /*循环结构的基本组成部分,一般可以分成四部分:1.初始化语句:在循环开始最初执行,而且只做唯一一次.2.条件判断:如果成立,则循环继续:如果不成立,则循环退出.3.循环体:重复要做的内容, ...

  9. Windows驱动开发-IRP结构体

    IRP的全名是I/O Request Package,即输入输出请求包,它是Windows内核中的一种非常重要的数据结构. 上层应用程序与底层驱动程序通信时,应用程序会发出I/O请求,操作系统将相应的 ...

  10. 实时监听input输入的变化(兼容主流浏览器)

    遇到如此需求,首先想到的是change事件,但用过change的都知道只有在input失去焦点时才会触发,并不能满足实时监测的需求,比如监测用户输入字符数. 在经过查阅一番资料后,欣慰的发现firef ...