📄 line.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>用Delphi编程时如何利用线程</title>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<p align="center"> <font color="#0000c0"></p>
<h2 align="center">用Delphi 编 程 时 如 何 利 用 线 程 </font></h2>
<h3 align="center">重 庆 邮 电 学 院 计 算 机 系 综 合 微 机 室<br>
马 英 杰 </h3>
<p><font color="#ffffff">----</font> Windows 95 是Microsoft 公 司 的 第 一 个 真
正 的 多 任 务 操 作 系 统。 在 每 一 时 刻 可 以<br>
有 多 个 进 程 同 时 工 作, 而 每 一 个 进 程 又 包 含 有 多 个 线
程。 但 只 有 一 个 处 理<br>
器 的 计 算 机 不 可 能 真 正 地“ 同 时” 执 行 多 个 线 程, 而
是 操 作 系 统 把 时 间 分 成<br>
若 干 个 时 间 片, 然 后 把 一 个 个 时 间 片 分 配 给 每 一 个 线
程。 </p>
<p><font color="#ffffff">----</font> 一 个 执 行 了 的 程 序 就 是 一 个 进
程, 一 个 进 程 则 至 少 有 一 个 主 线 程。 一 位<br>
高 级 程 序 员, 绝 不 会 让 自 己 的 程 序 里 面 只 有 一 个 主 线
程 存 在( 除 非 只 有 很<br>
少 的 几 十 行 代 码), 而 是 尽 量 让 自 己 的 程 序 在 同 一 时
刻 里 干 更 多 的 事, 在<br>
比 较 大 一 点 的 应 用 中 尤 其 如 此, 象 数 据 库 应 用 程 序,
在 统 计 的 时 候 我 还 想<br>
做 其 他 事 呢 ! 因 此, 如 何 有 效 地 利 用 线 程 则 是 每 一 个
程 序 员 都 应 了 解 的。<br>
本 文 就 此 简 单 地 谈 一 下 在Delphi 中 如 何 利 用 线 程。 </p>
<p><font color="#ffffff">----</font> ( 一) 当 使 用 线 程 时, 我 们 主 要 有
两 个 任 务: </p>
<p><font color="#ffffff">----</font> (1) 创 建 一 个 线 程。 </p>
<p><font color="#ffffff">----</font> (2) 创 建 一 个 能 作 为 线 程 入 口
的 函 数。 </p>
<p><font color="#ffffff">----</font> Windows API 调 用CreateThread 函 数 来 创 建
一 个 线 程。 函 数 如 下: </p>
<pre>HANDLE CreateThread(LPSECURITY_
ATTRIBUTES lpThreadAttributes,
//线程安全属性地址
DWORD dwStackSize,
//初始化线程堆栈尺寸
LPTHREAD_START_ROUTINE lpStartAddress,
//线程函数所指向的地址
LPVOID lpParameter,
//给线程函数传递的参数
DWORD dwCreationFlags,
//有关线程的标志
LPDWORD lpThreadId
//系统分配给线程的ID
);</pre>
<p><font color="#ffffff">----</font> 第 一 个 参 数 是 安 全 属 性, 一 般
设 为nil, 使 用 缺 省 的 安 全 属 性。 当 我 们 想 此<br>
线 程 有 另 外 的 子 进 程 时, 可 改 变 它 的 属 性。 </p>
<p><font color="#ffffff">----</font> 第 二 个 参 数 是 线 程 堆 栈 尺 寸,
一 般 设 为0, 表 示 与 此 应 用 的 堆 栈 尺 寸 相<br>
同, 即 主 线 程 与 创 建 的 线 程 一 样 长 度 的 堆 栈。 并 且 其
长 度 会 根 据 需 要 自 动<br>
变 长。 </p>
<p><font color="#ffffff">----</font> 第 三 个 参 数, 也 是 最 重 要 的 一
个, 是 一 个 指 向 函 数 名 的 指 针, 但 传 递 时<br>
很 简 单, 只 需 在 线 程 函 数 名 前 加 上@ 就 可 以 了。 </p>
<p><font color="#ffffff">----</font> 第 四 个 参 数 是 你 需 要 向 线 程 函
数 传 递 的 参 数, 一 般 是 一 个 指 向 结 构 的 指<br>
针。 不 需 传 递 参 数 时, 则 这 个 参 数 设 为nil。 </p>
<p><font color="#ffffff">----</font> 第 五 个 参 数, 传 入 与 线 程 有 关
的 一 些 标 志, 如 果 是CREATE_SUSPENDED, 则 创 建<br>
一 个 挂 起 的 线 程, 即 这 个 线 程 本 身 已 创 建, 它 的 堆 栈
也 已 创 建。 但 这 个 线<br>
程 不 会 被 分 配 给CPU 时 间, 只 有 当ResumeThread 函 数 被 调 用 后
才 能 执 行; 当 然,<br>
也 可 以 调 用SuspendThread 函 数 再 次 挂 起 线 程。 要 是 标 志 为0,
那 么 一 旦 建 立 线<br>
程, 线 程 函 数 就 被 立 即 调 用。 一 般 传 为0 即 可。 </p>
<p><font color="#ffffff">----</font> 最 后 一 个 参 数 是 系 统 分 配 给 这
个 线 程 的 唯 一 的ID 标 志。 </p>
<p><font color="#ffffff">----</font> 下 面 这 个 程 序MyThreadPro.pas 介 绍 了
线 程 如 何 建 立 及 使 用: </p>
<pre>//Your first test Thread Program.
unit MyThreadPro;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
UsedThread: TButton;
NoUsedThread: TButton;
procedure UsedThreadClick(Sender: TObject);
procedure NoUsedThreadClick(Sender: TObject);
var
Form1: TForm1;
implementation
{$R *.DFM}
//这是线程函数,
它可以放在下面程序的任何地方
function MyThreadFunc(P:pointer):Longint;stdcall;
var
i:integer;
DC:HDC;
S:string;
begin
DC:=GetDC(Form1.Handle);
for i:=0 to 100000 do begin
S:=Inttostr(i);
Textout(DC,10,10,Pchar(S),length(S));
end;
ReleaseDC(Form1.Handle,DC);
end;
procedure TForm1.UsedThreadClick(Sender: TObject);
var
hThread:Thandle;//定义一个句柄
ThreadID:DWord;
begin
//创建线程,同时线程函数被调用
hthread:=CreateThread(nil,0,@MyThreadfunc,nil,0,ThreadID);
if hThread=0 then
messagebox(Handle,'Didn’t Create a Thread',nil,MB_OK);
end;
procedure TForm1.NoUsedThreadClick(Sender: TObject);
begin
MyThreadfunc(nil);
//没有创建线程时,直接调用线程函数
end;
end.</pre>
<p><font color="#ffffff">----</font> 上 面 这 个 程 序 介 绍 了 我 们 在 使
用 线 程 及 未 使 用 线 程 二 种 情 况 下, 运 行 该<br>
程 序 的 反 应。 当 点UsedThread 按 钮 时, 则 建 立 一 个 线 程, 这
时 我 们 可 以 在 程 序<br>
进 行 计 算 的 同 时, 改 变 窗 体 的 尺 寸 及 移 动 它。 当 按 下NoUsedThread
按 钮 时, 不<br>
建 立 线 程, 我 们 会 发 现 在 程 序 没 有 计 算 完 之 前 根 本 不
能 做 其 它 任 何 事 情 !<br>
此 程 序 在 基 于Windows 95 的Delphi 3 中 运 行 通 过。 </p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -