delphi 助手helper应用之二 线程助手

本文介绍了一个使用Delphi xe10.3在Windows 7 64位系统下实现多线程同时访问同一文档的示例。通过创建多个TFileWriterThread线程,每个线程将随机数量的数据行写入到同一个文件中,展示了如何在Delphi中管理和协调多线程任务。

测试平台 win7 64+ delphixe 10.3

功能:多线程访问同一个文档

界面:

主界面代码:

unit MainFormU;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls,
  System.Generics.Collections, System.Classes, FileWriterThreadU;

type
  TMainForm = class(TForm)
    btnStart: TButton;
    ListBox1: TListBox;
    Timer1: TTimer;
    procedure btnStartClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Timer1Timer(Sender: TObject);
  private
    FOutputFile: TStreamWriter;
    FRunningThreads: TObjectList<TFileWriterThread>;
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}


procedure TMainForm.btnStartClick(Sender: TObject);
var
  I: Integer;
  Th: TFileWriterThread;
begin
  for I := 1 to 10 do
  begin
    Th := TFileWriterThread.Create(FOutputFile);
    FRunningThreads.Add(Th);
  end;
end;

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
var
  Th: TFileWriterThread;
begin
  for Th in FRunningThreads do
    Th.Terminate;
  FRunningThreads.Free; // Implicit WaitFor...
  FOutputFile.Free;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  FRunningThreads := TObjectList<TFileWriterThread>.Create(true);
  FOutputFile := TStreamWriter.Create(
    TFileStream.Create('OutputFile.txt', fmCreate or fmShareDenyWrite));{先创建后准备写操作}
end;

procedure TMainForm.Timer1Timer(Sender: TObject);
var
  Th: TFileWriterThread;
begin
  ListBox1.Items.BeginUpdate;
  try
    ListBox1.Items.Clear;
    for Th in FRunningThreads do
    begin
      if Th.WaitFor(0) = WAIT_TIMEOUT then
        ListBox1.Items.Add(Format('%5d RUNNING', [Th.ThreadID]))
      else
        ListBox1.Items.Add(Format('%5d TERMINATED', [Th.ThreadID]))
    end;
  finally
    ListBox1.Items.EndUpdate;
  end;
end;

end.

 


引用的单元

unit FileWriterThreadU;

interface

uses
  System.Classes, System.SyncObjs, System.SysUtils, System.IOUtils;

type
  TThreadHelper = class helper for TThread  {助手  :}
  public
    function WaitFor(ATimeout: Cardinal): LongWord; platform;
  end;

{TTimer事件处理程序中使用的WaitFor方法不是标准TThread类的一部分,而是使用类助手引入的。 这是因为TThread类上存在的标准WaitFor方法不会为等待提供超时,因此它会永远等待。 如果要检查线程是否已终止,或者只是想在等待线程终止时让GUI响应,则无法使用WaitFor方法执行此操作。 因此,我们添加了一个提供超时的新WaitFor方法。 当您调用WaitFor(0)时,您只询问线程是否仍在运行。 这是助手的另一个好用途。}

  TFileWriterThread = class(TThread)
  private
    FStreamWriter: TStreamWriter;
  protected
    procedure Execute; override;
  public
    constructor Create(AStreamWriter: TStreamWriter);
  end;

implementation

{$IF Defined(MSWINDOWS)}


uses
  Winapi.Windows;
{$IFEND}


constructor TFileWriterThread.Create(AStreamWriter: TStreamWriter);
begin
  FStreamWriter := AStreamWriter;
  inherited Create(false);

end;

procedure TFileWriterThread.Execute;
var
  I: Integer;
  NumLines: Integer;
begin
  inherited;
  NumLines := 11 + Random(50);
  for I := 1 to NumLines do
  begin
    TThread.Sleep(200);
    TMonitor.Enter(FStreamWriter);
    try
      FStreamWriter.WriteLine(Format('THREAD %5d - ROW %2d', [TThread.CurrentThread.ThreadID, I]));
    finally
      TMonitor.Exit(FStreamWriter);
    end;
    if Terminated then
      Break;
  end;
end;

{ TThreadHelper }

function TThreadHelper.WaitFor(ATimeout: Cardinal): LongWord;
begin
{$IF Defined(MSWINDOWS)}
  Result := WaitForSingleObject(Handle, ATimeout);
{$ELSE}
  raise Exception.Create('Available only on MS Windows');
{$IFEND}
end;

initialization

Randomize; // we'll use Random function in the thread.

end.

 

Delphi编程助手 Delphi Defamulus 是一款免费的开发辅助工具,它有以下功能: 1、配置数据源 单击“管理数据源”按钮,进入“数据源管理”窗口,单击“添加”按钮,打开“数据链接属性”窗口,选择对应的数据源提供程序(目前,系统支持MS SQL Server、MS Access、Oracle数据库,后续版本将增加MySql的支持) 输入服务器名称(或IP地址)、用户名称,如果需要密码,再输入密码,并勾选“允许保存密码”,选择数据库,然后点“确定”, 进入数据库类型设置窗口,选择对应的数据库类型,并点“确定”返回“数据源管理”窗口,点“关闭”按钮关闭“数据源管理”窗口。 2、设置项目信息 单击“管理工程组”按钮,进入“工程组管理”窗口,单击“添加”按钮,打开新工程属性设置窗口,设置工程名称、工程标题、选择刚才添加的数据源、输入工程路径,如果需要在工程中引入其它文件,请点击“其它属性”页,选择文件引入方式(如果选择“复制”,则将引入的文件拷贝一份到工程目录下,如果是“引用”,则只在工程文件中引用这些文件,并不复制。建议使用“复制”方式引入外部文件),点击“添加”按钮添加外部文件。设置完毕,点击“确定”按钮,返回“工程组管理”窗口,点击工具栏上的“打开”按钮,打开选中的工程。 3、设置生成选项勾选要设置的表(或视图),在右边属性页中设置业务名称(用于窗体标签和提示信息)、明细表、是否生成录入窗体、查询窗体,设置完成后,单击工具栏的“输出数据录入窗体”按钮,自动生成数据录入窗体代码,并输出到“输出”页中,单击“输出”页工具栏上的“预览窗体”按钮可以预览窗体外观。 4、输出工程源码 单击工具栏的“输出 Delphi 工程”按钮,进入“输出选项”窗口,在输出文件列表中选择要输出的文件,单击“确定”按钮,输出工程所需文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值