如此的调用线程,为何不起作用?解决方案
如此的调用线程,为何不起作用?
线程类
==================================================================
调用线程的方法一
==================================================================
调用线程的方法二
==================================================================
问题:为何方法二调用线程时主程序仍假死呢?而方法一调用线程则主程序不受影响。
------解决方案--------------------
Execute是protected
------解决方案--------------------
------解决方案--------------------
[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中才有效
------解决方案--------------------
你这样调用是直接调用了线程类里面的SendPic过程,与线程无关,当然界面会假死
3楼的方法是对的
------解决方案--------------------
create的时候传进去存在指定的变量里不就行了,constructor Create(strPicName:string);
------解决方案--------------------
楼主你的线程写的不怎么规范。
第一:Execute一般是protected的 而不是public
第二:想传参数就在create的时候传入。
线程类
- Delphi(Pascal) code
unit uTSavePic; interface uses Classes, StdCtrls, ComCtrls, ExtCtrls, Graphics, SysUtils; type TSavePic = class(TThread) private protected public constructor create; procedure Execute; override; procedure SendPic; end; implementation constructor TSavePic.create; begin FreeOnTerminate:=true; inherited create(false); end; procedure TSavePic.Execute; begin //访问一个不存在的网路路径,这会使用很长时间 end; procedure TSavePic.SendPic; begin //访问一个不存在的网路路径,这会使用很长时间 end; end.
==================================================================
调用线程的方法一
- Delphi(Pascal) code
TSavePic.Create;
==================================================================
调用线程的方法二
- Delphi(Pascal) code
var nTSavePic:TSavePic; begin nTSavePic:=TSavePic.Create; nTSavePic.SendPic;
==================================================================
问题:为何方法二调用线程时主程序仍假死呢?而方法一调用线程则主程序不受影响。
------解决方案--------------------
Execute是protected
------解决方案--------------------
------解决方案--------------------
[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中才有效
------解决方案--------------------
你这样调用是直接调用了线程类里面的SendPic过程,与线程无关,当然界面会假死
3楼的方法是对的
------解决方案--------------------
create的时候传进去存在指定的变量里不就行了,constructor Create(strPicName:string);
------解决方案--------------------
楼主你的线程写的不怎么规范。
第一:Execute一般是protected的 而不是public
第二:想传参数就在create的时候传入。
- Delphi(Pascal) code
constructor TSendThread.Create(CreateSuspended:Boolean;MainHandle:HWND); begin FHTTPClient:=TIdHTTP.Create(nil); FHTTPClient.ReadTimeout:=180000; FHTTPClient.ConnectTimeout:=60000; FMainHandle:=MainHandle;//传句柄 这个就是调用的时候把参数传过来。 inherited Create(CreateSuspended); end;