线程刷新界面(为了实时显示时间) ( 积分: 50 )

  • 主题发起人 主题发起人 lovecathy
  • 开始时间 开始时间
L

lovecathy

Unregistered / Unconfirmed
GUEST, unregistred user!
假设有如下控件:
-------------------
TMyControl = class(TGraphicControl)
protected
procedure Paint();
override;
public
property Canvas;
end;

procedure TMyControl.Paint();
begin
Canvas.TextOut(0, 0, DateTimeToStr(Now());
end;
-------------------
我需要实时显示当前时间,即使主线程处于“阻塞”状态,请问怎么实现一个线程,能安全的定时更新显示?
注:这个控件在主窗体上!
 
Canvas.Lock
Canvas.UnLock
Canvas.LockCount
 
主线程都“阻塞”了,主线程的代码都运行不下去了...怎么显示?痴人梦话!
 
晕,你就在主线程里显示时间三
其实游戏的原理,就是用一个主线程来刷新屏幕。
先通过其他线程把图像写在缓冲,最后一次性写到屏幕。
 
to linuxping:
既然TCanvas线程安全,我想我在子线程也可以强行调用主线程内控件的Paint方法吧。
理论上是可以的,而且这个我实践试验过了;
所以现在的主要问题是:
子线程调用主线程的Paint时怎么判断是否能取得有效的TCanvas.Handle(DC)。
 
TPaintProc = procedure() of object;
TPaintThread = class(TThread)
private
FInterval: Integer;
FPaintProc: TPaintProc;
protected
proceduredo
Paint();
virtual;
procedure Execute();
override;
public
constructor Create(CreateSuspended: Boolean;
Interval: Integer;
PaintProc: TPaintProc);
property Interval: Integer read FInterval write FInterval;
end;
......
procedure TPaintThread.Execute();
begin
while not Terminateddo
begin
do
Paint();
Sleep(FInterval);
end;
// while
end;

procedure TPaintThread.DoPaint();
begin
if Assigned(FPaintProc) then
begin
FPaintProc();
end;

end;

//--------------------
TAControl = class(TGraphicControl)
private
FPaintThread: TPaintThread;
protected
procedure ThreadPaint();
end;

constructor TCustomThreadPainter.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FPaintThread := TPaintThread.Create(False, 50, ThreadPaint);
end;

procedure TAControl.ThreadPaint();
begin
if { 如果Canvas能作图 } then
begin
Canvas.Lock();
try
Paint();
finally
Canvas.Unlock();
end;
end;
end;
 
一个比较笨的办法就是让界面(主线程)来启动和停止Paint线程(界面应该能保证TCanvas的有效性)
 
看看http://www.delphibbs.com/delphibbs/dispq.asp?lid=3661165
 
后退
顶部