Timer 正在运行时,如进行拖动窗体等操作就会出错,什么原因,如何解决?(100分)

  • 主题发起人 主题发起人 tansin
  • 开始时间 开始时间
T

tansin

Unregistered / Unconfirmed
GUEST, unregistred user!
我用Timer来实现一段滚动的文字。用在文字正在滚动时,如拖动窗口便会出现acess violation
的错误,在user32.dll内。我是在timer的处理函数内绘制文字的,我想似乎是一个同步问题
窗口消息循环自动实现了同步,但timer似乎打破了这个过程。但又不象,timer设计之初就应考虑
到这些问题。这是什么原因,如何解决。请求高人指点,有分可送。
 
你的循环是怎样实现的,是不是这部分代码的问题?
 
大概的思路是在Timer的处理函数中调用textout函数。
我的问题是在killertimer前不能进行拖动窗体的操作。
 
我的Timer测试代码如下:
static i = 0;
String s = IntToStr(i);
HDC hdc = GetDC(Handle);
TextOut(hdc, 10, 10, s.c_str(), s.Length());
ReleaseDC(Handle, hdc);
i ++;
将Timer的间隔改到50ms都没问题,所以应该不是同步问题。
是不是你的HDC没有释放,当窗口移动后再用它绘图而出现问题?
 
在一个tpaintbox的实例中:
SetTimer(0, fTimerID, FTimerInterval, @ShowTimerProc);
在ShowTimerProc中
begin
if ActivePaintBox <> nil then
for i := 0 to ActivePaintBox.Count - 1 do
with ActivePaintBox.Objects as TAnimationPaintBox do
if GetTimerID <> 0 then Draw;
end
其中activepaintbox指向该类型窗口的指针的数组,存储触发timer的该类型窗口。
Draw中具体的绘图。
我想这里面不存在你说的问题。
如果你是通过处理窗口过程的WM_TIMER消息的话就不会存在同步的问题。
也许错误在方法本身。



 
你这段代码是实现滚动文字的吗?怎么这么复杂...为什么不用TTimer控件呢?
我做了一个滚动文字的控件,里面用的是TTimer,在onTimer事件里调用TextOut
在窗口上绘出文字,怎么拖都没事。
 
问题解决了。
还是我破坏了同步规则。
现在我通过处理窗口过程就没问题了。
谢谢你的回应。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部