线程类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;==================================================================
问题:为何方法二调用线程时主程序仍假死呢?而方法一调用线程则主程序不受影响。
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;==================================================================
问题:为何方法二调用线程时主程序仍假死呢?而方法一调用线程则主程序不受影响。
解决方案 »
- 菜单问题
- 请问cxgrid 录入信息时 怎么添加本地图片 保存到数据库
- 使用内存映像文件的问题
- 请问delphi中,我想把变量的值打印出来,用什么语句?
- 急:谁有TDock97、TToolbar97、TToolbarButton97、TToolbarSep97?
- 小问题-大分数(不够再加)
- 请问Formcreate事件什么时候触发?
- 各位出差坐火车是否觉得查时刻表很烦?www.zzdw.com(郑州达维)的网络时刻表很快,很方便!中国目前最好的网络时刻表,决不吹牛!
- 请大家帮忙,想了一晚上!
- 如何创建用户名称及密码登录窗口
- delphi 怎么实现机构图的显示与打印
- delphi idhttp 存储cookies的问题
TSavePic .Create(False); 是创建的时候就调用
TSavePic .Create(True); 就要用Resume;来唤醒没有你的那种调用方式。
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楼的方法是对的
procedure TSavePic.SavePic(strPicName:string);
begin
//...
end;调用TSavePic.Create(False);之前该如何传入strpicname参数呢?
第一: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;