delphi里如何使用多线程?

30 | 问答知识库用户 |浏览163次
检举|收藏|2014/05/17 21:59
如题,写个简单的例子学习一下吧~
全部回答(1)
  • 有两种方法,,一种是用API函数createthread(),,一种是用delphi的TThread类,
    unit Unit1;  //使用API的,最简单的多线程程序了
    interface
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, shellAPI;  //这里要加shellAPI
    type
      TForm1 = class(TForm)
      .... 省略一大半....
    var
      Form1: TForm1;
      thread1,thread2 : Thandle;
      //句柄handle是一种指向指针的指针。我们知道,所谓指针是一种内存地址值,
      //指针相当于一把钥匙,有了钥匙你可以拿到柜子里的东西
      //有了指针,你可以拿到内存里的数据,
      
    implementation
    {$R *.dfm}
    procedure fun1; stdcall; //stdcall协调顺序用的
    var i: Integer;
    begin
      for i := 0 to 200000 do
      begin
        Form1.Canvas.Lock;
        Form1.Canvas.TextOut(10, 10, IntToStr(i));
        Form1.Canvas.Unlock;
      end;
    end;
    procedure fun2; stdcall;
    var i: Integer;
    begin
      for i := 0 to 200000 do
      begin
        Form1.Canvas.Lock;
        Form1.Canvas.TextOut(70, 10, IntToStr(i));
        Form1.Canvas.Unlock;
      end;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var ID:DWORD; //四个字节,Windows下经常用来保存地址(或者存放指针)
    begin
      thread1 := CreateThread(nil, 0, @fun1, nil, 0, ID);
      thread2 := CreateThread(nil, 0, @fun2, nil, 0, ID);
    end;
    end.

    unit Unit1;//使用Thread类的
    interface
    uses
    省略/...
    type
    省略...

     type fun1=class(Tthread)  //说明fun1来自Tthread抽象类
      protected               //自己写一个Execute的方法,覆盖原来的,下面是具体代码
        procedure Execute; override;
      end;
    type fun2=class(Tthread)
      protected
        procedure Execute; override;
      end;
    var
      Form1: TForm1;
    implementation

    {$R *.dfm}
    procedure fun1.Execute;   //execute的具体代码
    var i: Integer;
    begin
      FreeOnTerminate := True;  //这可以让线程执行完毕后随即释放
      for i := 0 to 200000 do
      begin
        Form1.Canvas.Lock;
        Form1.Canvas.TextOut(10, 10, IntToStr(i));
        Form1.Canvas.Unlock;
      end;
    end;
    procedure fun2.Execute;
    var i: Integer;
    begin
      FreeOnTerminate := True;
      for i := 0 to 200000 do
      begin
        Form1.Canvas.Lock;
        Form1.Canvas.TextOut(50, 10, IntToStr(i));
        Form1.Canvas.Unlock;
      end;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      fun1.Create(False);   //false为创建后,不挂起.就是立即执行execute方法
      fun2.Create(False);
    end;
    end.
     
    回答于 2014/05/17 21:59
0人关注该问题



 加载中...