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. 都客仿站高手已注册旗舰版V3.1

    链接:https://pan.baidu.com/s/1R5ldFDjekuXmEp42-8SQSQ 提取码:gkm9

  2. java后端开发echarts

    参考: https://blog.csdn.net/mxdmojingqing/article/details/77340245 https://github.com/abel533/ECharts

  3. Manacher(马拉车)算法

    Manacher算法是一个求字符串的最长回文子串一种非常高效的方法,其时间复杂度为O(n).下面分析以下其实行原理及代码: 1.首先对字符串进行预处理 因为回文分为奇回文和偶回文,分类处理比较麻烦,所 ...

  4. <c:foreach>指定循环次数

    <c:forEach begin="0" end="4" var="i"> <c:set var="ans&qu ...

  5. TortoiseGit+msysgit保存用户名和密码

    本文以windows系统为例 保存用户名和密码 在C盘的c:\Users**qing** (或可能是C:\Users\Administrator) (替换自己的用户名)找到.gitconfig, 如果 ...

  6. freeswitch install

    https://freeswitch.org/confluence/display/FREESWITCH/CentOS+7+and+RHEL+7

  7. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表格:表示一个危险的操作

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. Prometheus组件

    Prometheus组件 上一小节,通过部署Node Exporter我们成功的获取到了当前主机的资源使用情况.接下来我们将从Prometheus的架构角度详细介绍Prometheus生态中的各个组件 ...

  9. Linux系统资深运维工程师的进阶秘籍

    2010年毕业,从事IT行业已经接近7个年头,一路走来有很多不足,不论是技术上的还是工作当中的待人接事等,但正是这些不足让我有了现在的进步,技术上从最初的做水晶头,综合布线到服务器上架,网络设备调试, ...

  10. 二、java基础-运算符_控制语句_break_continue_return

    1.运算符 1)算术运算符:6个+ — * \ % ++  --2)关系运算符:6个>  >=  <  <=   ==   !=3)布尔运算符&&并且  ||或 ...