delphi7 开发组件类怎么使用多线程?

无幻 2011-03-02 03:17:12
比如我要开发一个时钟的控件类,派生自TGraphicControl,具体在其Paint里面画时钟,然后在这个类里添加了派生自TThread的多线程类,想要以线程来每秒重画时钟,大概如下
TimeThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
procedure DoEverySecond;
end;
TClock = class(TGraphicControl)
private
FTimeThread: TimeThread;
procedure EverySecondDraw();
end;
procedure TimeThread.DoEverySecond;
begin
{如何在这里面调用TClock的函数EverySecondDraw}
end;
procedure TimeThread.Execute;
begin
FreeOnTerminate := True;
while not Terminated do
begin
Synchronize(DoEverySecond);
Sleep(1000);
end;
end;


不知道我上面的思路有没有错,但是我不懂怎么调用自定义的控件类TClock去重画时钟?
...全文
353 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
newfang 2011-03-04
  • 打赏
  • 举报
回复
也可以在你的线程类构造函数加一个参数,把时钟对象传递进去。
无幻 2011-03-03
  • 打赏
  • 举报
回复
自己解决了。主要是传递事件
  TimeThread = class(TThread)
private
FOnExecute: TNotifyEvent;
protected
procedure DoExecute;
procedure Execute; override;
public
property OnExecute: TNotifyEvent read FOnExecute write FOnExecute;
end;

实现
procedure TimeThread.DoExecute;
begin
if Assigned(FOnExecute) then
FOnExecute(Self);
end;

procedure TimeThread.Execute;
begin
FreeOnTerminate := True;
while not Terminated do
begin
Synchronize(DoExecute);
Sleep(1000);
end;
end;



而组件类要使用这个线程的话,得先包含他的对象,然后赋事件给线程体。
  TClock = class(TGraphicControl)
private
procedure EverySecondDraw(sender: TObject);
protected
procedure Paint; override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
{```````}
end;

创建时
constructor TClock.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FTimeThread := TimeThread.Create(True);
FTimeThread.OnExecute := EverySecondDraw;
FTimeThread.Resume;
end;
无幻 2011-03-02
  • 打赏
  • 举报
回复
有谁这样子做过的吗?
无幻 2011-03-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]
在控件创建时,就启动内部线程,或者人工启动
[/Quote]
恩有啊,我是在控件创建的时候,创建启动线程的,但是我不知道线程体函数那边怎么发消息告诉Clock说“已经过1秒了,该刷新时钟了”,所以特请教下。
constructor TClock.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FTimeThread := TimeThread.Create(False);
end;

bdmh 2011-03-02
  • 打赏
  • 举报
回复
在控件创建时,就启动内部线程,或者人工启动

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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