同时画三个图,用三个TIMER该怎么画?散分! 我用三个TIMER同时画三个图,可是第一个图还可以,第二个太慢,第三个简直就不画!我是用TIMER,一个一个点画的心电图,由于需要控制速度和波幅等,必须用TIMER控制。听说多线程可以解决冲突问题,但是我要在1/128秒就画一个点,那么时间又无法控制。请问大家,有何高见。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 那可能是你画的时候效率有问题,可能不是Timer的问题,估计用线程也不行!因为VCL的Canvas上作图时要用Synchronize来作,这样图才不会把画布画“脏”,也只有这样才是安全的。而Synchronize其实是让方法丢给主给线程来执行的,这样能避免线程冲突;这样就和用Timer估计效果类似了。 -------我推测的不过你可以试试看,毕竟实际最有说服力 用一个TIMER不行吗?画完一个圆的一个点,再画另一个圆的一个点,TIMER一次就分别画三个点,不就同步了吗? Timer肯定不行,因为WM_TIMER消息只会保留最后一个多线程肯定可以,画这个操作虽然需要做同步,但一个线程锁定做绘图操作时,其它线程只是等待,不像用WM_TIMER会丢消息,导致二,三无法正常绘制时间也好控制,用CreateWaitableTimer创建一个内核计时器就可以搞定,不过线程资源竞争的问题,没有一定经验是比较难解决的,而且极其难调试. 好象楼上都忽略了一个很严重的问题。用Timer想达到128HZ,是不是不可能呢。。 不知道你的心电图的算法是怎样的我用简单的lineto模拟了一下,没什么问题啊?unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;type TForm1 = class(TForm) Timer1: TTimer; Timer2: TTimer; Timer3: TTimer; Label1: TLabel; Label2: TLabel; Label3: TLabel; procedure Timer1Timer(Sender: TObject); procedure Timer2Timer(Sender: TObject); procedure Timer3Timer(Sender: TObject); private { Private declarations } public x,y,z:integer; end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Timer1Timer(Sender: TObject);begin LABEL1.Canvas.LineTo(x,LABEL1.Height); inc(x); LABEL1.Canvas.MoveTo(x,0);end;procedure TForm1.Timer2Timer(Sender: TObject);begin LABEL2.Canvas.LineTo(y,LABEL2.Height); inc(y); LABEL2.Canvas.MoveTo(y,0);end;procedure TForm1.Timer3Timer(Sender: TObject);begin LABEL3.Canvas.LineTo(z,LABEL3.Height); inc(z); LABEL3.Canvas.MoveTo(z,0);end;end.楼上各位说的情况没出现阿? Timer最好用一个,你的问题多线程可以解决 谢谢各位大哥的支持我已经解决。是用多线程。另外,画图最忌讳重叠,我发现一个大的IMAGE重叠,画起来简直就是恶梦。谢谢! 如何扫描一个文件夹获取文件目录列表 关于一个 udp 接收的问题 导出问题,我用的是Grid控件 何处有WinMessenger v2.1的原码下载 很急,ADOQuery做插入数据问题 TClientSocket是否支持读写异步?就是说onread和onwrite能否同时发生? 如何定义一个有多个返回值的函数?? 请问下cxgrid blobedit类型??? 请看这个“Undeclared identifier: 'mrOK'”问题? Fast Report 里面,Count怎么不能用啊?SOS! 急用??? 如何清除系统中注册的远程数据模块
因为VCL的Canvas上作图时要用Synchronize来作,这样图才不会把画布画“脏”,也只有这样才是安全的。而Synchronize其实是让方法丢给主给线程来执行的,这样能避免线程冲突;这样就和用Timer估计效果类似了。
-------我推测的
不过你可以试试看,毕竟实际最有说服力
TIMER一次就分别画三个点,不就同步了吗?
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;type
TForm1 = class(TForm)
Timer1: TTimer;
Timer2: TTimer;
Timer3: TTimer;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure Timer1Timer(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure Timer3Timer(Sender: TObject);
private
{ Private declarations }
public
x,y,z:integer;
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Timer1Timer(Sender: TObject);
begin
LABEL1.Canvas.LineTo(x,LABEL1.Height);
inc(x);
LABEL1.Canvas.MoveTo(x,0);
end;procedure TForm1.Timer2Timer(Sender: TObject);
begin
LABEL2.Canvas.LineTo(y,LABEL2.Height);
inc(y);
LABEL2.Canvas.MoveTo(y,0);
end;procedure TForm1.Timer3Timer(Sender: TObject);
begin
LABEL3.Canvas.LineTo(z,LABEL3.Height);
inc(z);
LABEL3.Canvas.MoveTo(z,0);
end;end.
楼上各位说的情况没出现阿?
我已经解决。是用多线程。
另外,画图最忌讳重叠,我发现一个大的IMAGE重叠,画起来简直就是恶梦。
谢谢!