用Delphi编程时如何利用线程

  • 来源: 互联网 作者: 若水   2008-03-20/14:53
  • ----Windows95是Microsoft公司的第一个真正的多任务操作系统。在每一时刻可以有多个进程同时工作,而每一个进程又包含有多个线程。但只有一个处理器的计算机不可能真正地“同时”执行多个线程,而是操作系统把时间分成若干个时间片,然后把一个个时间片分配给每一个线程。

    ----一个执行了的程序就是一个进程,一个进程则至少有一个主线程。一位高级程序员,绝不会让阿自己的程序里面只有一个主线程存在(除非只有很少的几十行代码),而是尽量让自己的程序在同一时刻里干更多的事,在比较大一点的应用中尤其如此,象数据库应用程序,在统计的时候我还想做其他事呢!因此,如何有效地利用线程则是每一个程序员都应了解的。本文就此简单地谈一下在Delphi中如何利用线程。

    ----(一)当使用线程时,我们主要有两个任务:
    ----(1)创建一个线程。
    ----(2)创建一个能作为线程入口的函数。
    ----WindowsAPI调用CreateThread函数来创建一个线程。函数如下:

    HANDLE CreateThread(LPSECURITY_
    ATTRIBUTESlpThreadAttributes,
    //线程安全属性地址
    DWORDdwStackSize,
    //初始化线程堆栈尺寸
    LPTHREAD_START_ROUTINElpStartAddress,
    //线程函数所指向的地址
    LPVOIDlpParameter,
    //给线程函数传递的参数
    DWORDdwCreationFlags,
    //有关线程的标志
    LPDWORDlpThreadId
    //系统分配给线程的ID
    );
    ----第一个参数是安全属性,一般设为nil,使用缺省的安全属性。当我们想此线程有另外的子进程时,可改变它的属性。
    ----第二个参数是线程堆栈尺寸,一般设为0,表示与此应用的堆栈尺寸相同,即主线程与创建的线程一样长度的堆栈。并且其长度会根据需要自动变长。
    ----第三个参数,也是最重要的一个,是一个指向函数名的指针,但传递时很简单,只需在线程函数名前加上@就可以了。
    ----第四个参数是你需要向线程函数传递的参数,一般是一个指向结构的指针。不需传递参数时,则这个参数设为nil。
    ----第五个参数,传入与线程有关的一些标志,如果是CREATE_SUSPENDED,则创建一个挂起的线程,即这个线程本身已创建,它的堆栈也已创建。但这个线程不会被分配给CPU时间,只有当ResumeThread函数被调用后才能执行;当然,也可以调用SuspendThread函数再次挂起线程。要是标志为0,那么一旦建立线程,线程函数就被立即调用。一般传为0即可。
    ----最后一个参数是系统分配给这个线程的唯一的ID标志。
    ----下面这个程序MyThreadPro.pas介绍了线程如何建立及使用:

    //Your first test Thread Program.
    unit MyThreadPro;
    interface
    uses
    Windows,Messages,SysUtils,Classes,
    Graphics,Controls,Forms,Dialogs,
    StdCtrls;
    type
    TForm1=class(TForm)
    UsedThread:TButton;
    NoUsedThread:TButton;
    procedure UsedThreadClick(Sender:TObject);
    procedure NoUsedThreadClick(Sender:TObject);
    var
    Form1:TForm1;
    implementation
    {$R*.DFM}
    //这是线程函数,
    它可以放在下面程序的任何地方
    function MyThreadFunc(P:pointer):Longint;stdcall;
    var
    i:integer;
    DC:HDC;
    S:string;
    begin
    DC:=GetDC(Form1.Handle);
    for i:=0 to 100000 do begin
    S:=Inttostr(i);
    Textout(DC,10,10,Pchar(S),length(S));
    end;
    ReleaseDC(Form1.Handle,DC);
    end;
    procedure TForm1.UsedThreadClick(Sender:TObject);
    var
    hThread:Thandle;//定义一个句柄
    ThreadID:DWord;
    begin
    //创建线程,同时线程函数被调用
    hthread:=CreateThread(nil,0,@MyThreadfunc,nil,0,ThreadID);
    ifhThread=0then
    messagebox(Handle,'Didn’tCreateaThread',nil,MB_OK);
    end;
    procedure TForm1.NoUsedThreadClick(Sender:TObject);
    begin
    MyThreadfunc(nil);
    //没有创建线程时,直接调用线程函数
    end;
    end.
    ----上面这个程序介绍了我们在使用线程及未使用线程二种情况下,运行该程序的反应。当点UsedThread按钮时,则建立一个线程,这时我们可以在程序进行计算的同时,改变窗体的尺寸及移动它。当按下NoUsedThread按钮时,不建立线程,我们会发现在程序没有计算完之前根本不能做其它任何事情!
    此程序在基于Windows95的Delphi3中运行通过。  

    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多