初學者怎麽去理解多線程技術!又該怎麽去學習使用多線程!希望高手用通俗的語言描述一下!!
謝謝!!!!!困擾中......30分雖少,但也是我一份心!!!!多謝!!

解决方案 »

  1.   

    一个程序是一个进程,进程是由线程组成的。
    有很多资料的,耐心的看就是了,给你发几个。             多线程编程    2-1 多线程的基本概念    WIN 98/NT/2000/XP 是个多任务操作系统,也就是:一个进程可以划
    分为多个线程,每个线程轮流占用CPU 运行时间和资源,或者说,把CPU 
    时间划成片,每个片分给不同的线程,这样,每个线程轮流的“挂起”和
    “唤醒”,由于时间片很小,给人的感觉是同时运行的。
        多线程带来如下好处:(自己阅读)
        1)避免瓶颈;
        2)并行操作;
        3)提高效率;
        在多线程中,通过优先级管理,可以使重要的程序优先操作,提高了
    任务管理的灵活性。
        另一方面,在多CPU 系统中,可以把不同的线程在不同的CPU 中执行,
    真正做到同时处理多任务(Win 98 只是模拟的,而Win/NT/2000是真正的
    多CPU同时操作)。    多线程的两个概念:    1) 进程:也称任务,程序载入内存,并分配资源,称为“一个进程
    ”。注意:进程本身并不一定要正在执行。进程由以下几部分组成:
        a>一个私有的地址空间,它是进程可以使用的一组虚拟内存地址空间;
        b>程序的相关代码、数据源;
        c>系统资源,比如操作系统同步对象等;
        d>至少包含一个线程(主线程);    2) 线程:是程序的执行单位(线程本身并不包括程序代码,真正拥
    有代码的是进程),每个进程至少包括一个线程,称为主线程,一个进程
    如果有多个线程,就可以共享同一进程的资源,并可以并发执行。
        线程是进程的一个执行单元,是操作系统分配CPU 时间的基本实体,
    线程主要由如下两部分组成:
        a>数据结构;
        b>CPU 寄存器和堆栈;
        一个进程中的线程,可以独立运行,也可以控制另一个线程的运行。    请注意:
        多线程不能滥用,书上提到了多线程的几个缺点(自阅)。    2-2 Tthread 对象    虽然Windows 提供了比较多的多线程设计的API 函数,但是直接使用
    API 函数一方面极其不方便,而且使用不当还容易出错。为解决这个问题,
    Borland 公司率先推出了一种Tthread 对象,来解决多线程设计上的困难,
    简化了多线程问题的处理。
        应该注意,Tthread 对象是没有实例的,它和界面的交流,主要依靠
    主窗体(主VCL线程),这和其他对象使用上有些区别。   一、Tthread 对象的主要方法    构造线程:    constructor Create(CreateSuspended:boolean)    其中:CreateSuspended=true  构造但不唤醒
                              false 构造的同时即唤醒    也可以用如下方法    inheried Create(CreateSuspended:boolean)
        挂起线程:    suspend
        
        (把线程挂起的次数加一)    唤醒线程:    resume    (注意:注意这个属性是把线程挂起的次数减一,当次数为0 时,
    即唤醒。也就是说,线程挂起多少次,唤醒也需要多少次。同时挂起
    的时候将保持线程的地址指针不变,所以线程挂起后再唤醒,将从挂
    起的地方开始运行)    析构(清除线程所占用的内存):    destroy    终止线程(后面会具体讨论):    Terminate    二、线程应用的简单例子:    下面通过一个例子说明上述方法的应用。我们知道,循环是独占
    性最强的运行方式之一,现在希望建立两个线程对象,实现循环的并
    行运行。具体方法如下:    File---New---Thread Object    这就自动在主Form中建立了一个线程单元(在对话框里写上线程名
    字),默认的名字是Unit2。同样方法建立第二个线程单元Unit3。
        
        要注意的是:Unit2和Unit3中有一个给定的过程:    procedure Object.Execute;
        begin    end;    其中的程序是线程唤醒后自动执行的程序,也可以在里面调用其
    他自定义的过程和函数。这个过程的结束,意味着线程程序的结束。
        为了构造线程,在interface的Type区,定义一个构造过程:    type
          Object = class(TThread)  //自动给出的,也可以直接改      private
         
          protected         procedure Execute; override;
          
          public
          constructor create;      //自己写的     并且在implementation区域写上:     constructor Object.create;
         begin
           inherited create(true);
         end
        
        其中Object 为线程对象的名字。所以这么写,是希望在主Form中
    调用这个构造过程。
        Create()的参数用True,表明构造出的线程为挂起状态。
        注意一下,在同一个线程对象里,如果两次构造,将产生两个独立
    的线程,不但运行是独立的,而且使用线程的局部变量也是独立的。但
    这里为了简化问题,还是建立了两个独立的线程对象,而且两个循环数
    是不同的,在并行运算时容易判断出是两个不同的程序在运行。       假定我们给两个线程对象起的名字是:    mymath1
        mymath2     这样在Unit1,应该作如下声明:
      
        implementation    {$R *.DFM}    uses unit2,unit3;    var thread1:mymath1;
            thread2:mymath2;    这样在主线程,将可以通过这两个线程变量调用对应的线程方法。     在主线程区构造线程的方法是:    thread1:=mymath1.create;
        thread2:=mymath2.create;    挂起:    thread1.suspend;
        thread2.suspend;    唤醒:    thread1.resume;
        thread2.resume;    析构:     thread1.destroy;
         thread2.destroy;     
      

  2.   

    假如你有很多过程要同时运行,只要:例如 过程名为
    PPPP1;
    PPPP2
    PPPP3;
    PPPP4;如果想让这四个过程同时运行

    var
    threadid1,threadid2,threadid3,threadid4:cardinal;begin
    createthread(nil,0,@PPPP1,nil,0,Threadid1);
    createthread(nil,0,@PPPP2,nil,0,Threadid2);
    createthread(nil,0,@PPPP3,nil,0,Threadid3);
    createthread(nil,0,@PPPP4,nil,0,Threadid4);
    end;
    如果要强行结束线程,则 terminatethread(threadid1,0);
     terminatethread(threadid2,0);
     terminatethread(threadid3,0);
     terminatethread(threadid4,0);
      

  3.   

    进程和线程都只不过是一个记录结构,进程记录着程序的一切信息,而线程为了分配cpu时间,至少记录着进程号、线程号、优先级标志、函数入口地址。创建线程就是向计算机注册这样一个结构。计算机就会按照这些结构分配cpu时间。