delphi线程详细教程简单到复杂(3)

2019-03-03 23:03

在下面的例子中, 有新线程不断给一个全局变量赋随机值;

同时窗体上的 Timer 控件每隔 1/10 秒就把这个变量写在窗体标题; 在这个过程中演示了 ResumeThread、SuspendThread 两个函数.

//上面图片中演示的代码。 unit Unit1;

interface uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls; type

TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Timer1: TTimer;

procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject);

end; var

Form1: TForm1;

implementation

{$R *.dfm} var

hThread: THandle; {线程句柄}

num: Integer; {全局变量, 用于记录随机数}

{线程入口函数}

function MyThreadFun(p: Pointer): Integer; stdcall; begin

while True do {假如线程不挂起, 这个循环将一直循环下去} begin

num := Random(100); end; Result := 0; end;

{建立并挂起线程}

procedure TForm1.Button1Click(Sender: TObject); var

ID: DWORD; begin

hThread := CreateThread(nil, 0, @MyThreadFun, nil, CREATE_SUSPENDED, ID);

Button1.Enabled := False; end;

{唤醒并继续线程}

procedure TForm1.Button2Click(Sender: TObject); begin

ResumeThread(hThread); end;

{挂起线程}

procedure TForm1.Button3Click(Sender: TObject); begin

SuspendThread(hThread); end;

procedure TForm1.FormCreate(Sender: TObject); begin

Timer1.Interval := 100; end;

procedure TForm1.Timer1Timer(Sender: TObject); begin

Text := IntToStr(num); end; end.

㈢、入口函数的参数

function CreateThread( lpThreadAttributes: Pointer; dwStackSize: DWORD;

lpStartAddress: TFNThreadStartRoutine; lpParameter: Pointer; {入口函数的参数} dwCreationFlags: DWORD; var lpThreadId: DWORD ): THandle; stdcall;

线程入口函数的参数是个无类型指针(Pointer), 用它可以指定任何数据; 本例是把鼠标点击窗体的坐标传递给线程的入口函数, 每次点击窗体都会创建一个线程.

运行效果图:

//上面演示的代码 unit Unit1;

interface uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs; type

TForm1 = class(TForm)

procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); end; var

Form1: TForm1;

implementation

{$R *.dfm} var

pt: TPoint; {这个坐标点将会已指针的方式传递给线程, 它应该是全局的}

function MyThreadFun(p: Pointer): Integer; stdcall; var

i: Integer;

pt2: TPoint; {因为指针参数给的点随时都在变, 需用线程的局部变量存起来} begin

pt2 := PPoint(p)^; {转换} for i := 0 to 1000000 do begin

with Form1.Canvas do begin


delphi线程详细教程简单到复杂(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:51单片机使用ds3231模块

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: