如此的调用线程,为何不起作用?

程晨c 2012-03-30 06:53:03
线程类

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.

==================================================================
调用线程的方法一
TSavePic.Create;

==================================================================
调用线程的方法二

var
nTSavePic:TSavePic;
begin
nTSavePic:=TSavePic.Create;
nTSavePic.SendPic;

==================================================================
问题:为何方法二调用线程时主程序仍假死呢?而方法一调用线程则主程序不受影响。
...全文
88 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
一剑飘雪 2012-03-31
  • 打赏
  • 举报
回复
楼主你的线程写的不怎么规范。
第一: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;
cyistudio 2012-03-31
  • 打赏
  • 举报
回复
create的时候传进去存在指定的变量里不就行了,constructor Create(strPicName:string);
程晨c 2012-03-31
  • 打赏
  • 举报
回复
是在线程类的Create函数中传入吗?
程晨c 2012-03-31
  • 打赏
  • 举报
回复
那么如何传入参数呢,加入我要在savepic函数中增加strpicname图像名称参数
procedure TSavePic.SavePic(strPicName:string);
begin
//...
end;

调用TSavePic.Create(False);之前该如何传入strpicname参数呢?
cdchq 2012-03-30
  • 打赏
  • 举报
回复
你这样调用是直接调用了线程类里面的SendPic过程,与线程无关,当然界面会假死
3楼的方法是对的
蓝色光芒 2012-03-30
  • 打赏
  • 举报
回复
[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中才有效
wrost 2012-03-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
线程类

Delphi(Pascal) code


unit uTSavePic;

interface

uses
Classes, StdCtrls, ComCtrls, ExtCtrls, Graphics, SysUtils;

type
TSavePic = class(TThread)
private

protected

p……
[/Quote]


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

没有你的那种调用方式。




cntigercat 2012-03-30
  • 打赏
  • 举报
回复
Execute是protected

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧