线程类unit uTSavePic;interfaceuses
  Classes, StdCtrls, ComCtrls, ExtCtrls, Graphics, SysUtils;type
  TSavePic = class(TThread)
  private  protected  public
    constructor create;
    procedure Execute; override;
    procedure SendPic;
  end;implementationconstructor TSavePic.create;
begin
  FreeOnTerminate:=true;
  inherited create(false);
end;procedure TSavePic.Execute;
begin
  //访问一个不存在的网路路径,这会使用很长时间
end;procedure TSavePic.SendPic;
begin
  //访问一个不存在的网路路径,这会使用很长时间
end;end.==================================================================
调用线程的方法一
TSavePic.Create;
==================================================================
调用线程的方法二var
  nTSavePic:TSavePic;
begin
  nTSavePic:=TSavePic.Create;
  nTSavePic.SendPic;==================================================================
问题:为何方法二调用线程时主程序仍假死呢?而方法一调用线程则主程序不受影响。

解决方案 »

  1.   

    你查查线程的帮助:
    TSavePic .Create(False);   是创建的时候就调用
    TSavePic .Create(True);  就要用Resume;来唤醒没有你的那种调用方式。
       
      

  2.   

    [code=Delphi(Pascal)]
      TSavePic = class(TThread)
      private
        fIsSavePic : Boolean;
        procedure SavePic;
        procedure SendPic;
      public
        constructor create(IsSavePic : Boolean);
        procedure Execute; override;
      end;
    constructor TSavePic.create(IsSavePic : Boolean);
    begin
      FreeOnTerminate:=true;
      fIsSavePic := IsSavePic;
      inherited create(false);
    end;procedure TSavePic.Execute;
    begin
      if fIsSavePic then SavePic
      else SendPic;
    end;procedure TSavePic.SavePic;
    begin
      //...
    end;procedure TSavePic.SendPic;
    begin
      //...
    end;TSavePic.Create(False);  //这是调用SavePic
    TSavePic.Create(True);   //这是调用SendPic[code]
    你的方法2,相当于直接调用一个类的方法,压根没经过线程.
    线程类的方法只有写在Execute中才有效
      

  3.   

    你这样调用是直接调用了线程类里面的SendPic过程,与线程无关,当然界面会假死
    3楼的方法是对的
      

  4.   

    那么如何传入参数呢,加入我要在savepic函数中增加strpicname图像名称参数
    procedure TSavePic.SavePic(strPicName:string);
    begin
      //...
    end;调用TSavePic.Create(False);之前该如何传入strpicname参数呢?
      

  5.   

    是在线程类的Create函数中传入吗?
      

  6.   

    create的时候传进去存在指定的变量里不就行了,constructor Create(strPicName:string);
      

  7.   

    楼主你的线程写的不怎么规范。
    第一:Execute一般是protected的  而不是public
    第二:想传参数就在create的时候传入。constructor TSendThread.Create(CreateSuspended:Boolean;MainHandle:HWND);
    begin
      FHTTPClient:=TIdHTTP.Create(nil);
      FHTTPClient.ReadTimeout:=180000;
      FHTTPClient.ConnectTimeout:=60000;
      FMainHandle:=MainHandle;//传句柄  这个就是调用的时候把参数传过来。  inherited Create(CreateSuspended);
    end;