zoukankan      html  css  js  c++  java
  • Delphi 多线程的例子

    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;
    
    type
      TMyThread = class(TThread)
        private
        FNum:Integer;
        protected
          procedure Execute;override;
          procedure Run;
          procedure SetNum(Value:integer);  {设置Num}
          function GetNum:integer;          {获取Num}
          constructor Create(Aswith:Boolean;ANum:Integer);  {给创建方法添加一个参数用于传递}
        public
      end;
    
      TForm1 = class(TForm)
        pb1: TPaintBox;
        pb2: TPaintBox;
        pb3: TPaintBox;
        btn1: TButton;
        procedure btn1Click(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    uses SyncObjs;
    
    const
       colors:array[0..2] of TColor =(clRed,clGreen,clBlue);
    
    var
      MyThread:TMyThread;
      paintArr:array[0..2] of TPaintBox;
    //  MyThreadArr:array[0..2] of TMyThread;  {也可用数组多个线程进行}
      Mutex:TMutex;
    
    
    procedure TForm1.btn1Click(Sender: TObject);
    var
      i:integer;
    begin
      if Assigned(Mutex) then Mutex.Free;   {如果存在,先释放}
      Mutex:=TMutex.Create(False);           {创建互斥体,参数为创建者先不占用}
      Repaint;                               {重画窗体}
      paintArr[0]:=pb1;                       {把PaintBox1给数组paintArr[0]}
      paintArr[1]:=pb2;
      paintArr[2]:=pb3;
      for i := Low(paintArr )to High(paintArr) do
      begin
        MyThread:=TMyThread.Create(False,i);  {如果声明了线程数组类,可以在这里一起做循环多个线程操作}
      end;
    end;
    
    { TMyThread }
    
    
    
    constructor TMyThread.Create(ASwith: Boolean; ANum: Integer);
    begin
      inherited Create(Aswith);   {继承并传参}
      SetNum(ANum);               {设置字段Num}
    end;
    
    procedure TMyThread.Execute;
    begin
      inherited;
      FreeOnTerminate:=True;
      Run;
    end;
    
    function TMyThread.GetNum: integer;
    begin
      Result:=FNum;
    end;
    
    procedure TMyThread.Run;
    var
      i,n,x1,x2,y1,y2:integer;
    begin
      n:=GetNum;
      paintArr[n].Color:=Colors[n];
      for i := 0 to 200 do
      begin
        if Mutex.WaitFor(INFINITE)=wrSignaled then  {判断互斥体有没有被占用}
        begin
          with paintArr[n] do
          begin
            x1:=Random(Width);y1:=Random(Height);
            x2:=Random(Width);y2:=Random(Height);
            Canvas.Lock;
            Canvas.Ellipse(x1,y1,x2,y2);
            Canvas.Unlock;
            Sleep(10);
          end;
        end;
        Mutex.Release;  {释放放这里为每进行一次,释放,谁拿到谁用}
      end;
    //   Mutex.Release;  {释放放这里为每进行一轮循环,释放,相当于排队进行}
    end;
    
    procedure TMyThread.SetNum(Value: integer);
    begin
      FNum:=Value;
    end;
    
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      Mutex.Free;
    end;
    
    end.
  • 相关阅读:
    sql server还原数据库(请选择用于还原的备份集)
    初学K3Cloud开发
    SQL-视图
    2019-07-31 C#基础知识学习
    2019-07-30 C#基础知识学习
    初学数据库
    什么时候该使用SUM()函数
    Mongo Document 校验
    Linux Mysql操作命令
    说一说Unsafe魔法类
  • 原文地址:https://www.cnblogs.com/westsoft/p/14367896.html
Copyright © 2011-2022 走看看