• Delphi之多线程实例


    其他的我也就不多说了,说也说不好,再说这个东东因为暂时没有完全搞懂所以也不好说!之就给代码吧

    program TestThread;

    uses
      Forms,
      Main in 'Main.pas' {Form1},
      TstThrd in 'TstThrd.pas';

    {$R *.res}

    begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.

    ===============工程文件结束===============

    unit Main;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls, Mask, TstThrd;

    type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Image1: TImage;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    var
      newThread: TTstthread;
    begin
      newThread := TTstThread.Create(False);
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
      Image1.Picture.LoadFromFile(ExtractFilePath(Application.ExeName) + '0.bmp');
    end;

    end.

    ===================Main.Pas结束================

    unit TstThrd;

    interface

    uses
      Classes;

    type
      TTstThread = class(TThread)
      private
        { Private declarations }
        Answer: integer;
      protected
        procedure GiveAnswer;
        procedure Execute; override;
      end;

    implementation
    uses SysUtils, Main;

    { Important: Methods and properties of objects in visual components can only be
      used in a method called using Synchronize, for example,

          Synchronize(UpdateCaption);

      and UpdateCaption could look like,

        procedure TTstThread.UpdateCaption;
        begin
          Form1.Caption := 'Updated in a thread';
        end; }

    { TTstThread }
    procedure TTstThread.GiveAnswer;
    begin
      Form1.Edit1.Text := IntToStr(Answer);
    end;

    procedure TTstThread.Execute;
    var
      i: integer;
    begin
      { Place thread code here }
      FreeOnTerminate := true;
      for i := 0 to 2000000 do
      begin
        if Terminated then break;
        inc(Answer, Round(Abs(Sin(Sqrt(i)))));
        Synchronize(GiveAnswer);
      end;
    end;

    end.

    ==================线程单元结束=====================

          代码很简单,只是一个计算,不过这个计算却比较费时间。多线程情况下,你可以操作按钮一来就算,同时也可以来操作按钮二来载入一幅图片,不会出现程序假死状态;但是单线程就容易假死,只有等待数据计算完毕才可以在如图片。单线程的代码我就不贴了,比较容易。

          最近读书学习,一边看书一边做一些例程,在此记录下来,以供自己以后查阅,我想各位大虾可以略过了。如果您不惜赐教,鄙人将万分感激!谢谢。

  • 相关阅读:
    autofac meta
    RazorEngine 3.6.5.0
    pfx 转 snk
    git
    Nlog Layout
    NLog 传递参数
    扫描.net dll引用dll
    vbox android x86 分辨率
    Andriod x86 4,4
    .net cli 源码
  • 原文地址:https://www.cnblogs.com/spider518/p/1904755.html
Copyright © 2020-2023  润新知