作者pttnoodles (C.L ~)
看板C_Sharp
标题[问题] 如何使用GDI+ 绘出同示波器的波形效果?
时间Wed Oct 24 11:01:05 2012
如题,小弟目前使用过MSCHART ...与 ZedGraph套件
将读进来的数值进行及时绘图 ( 讯息的速率为1点/1ms )
一秒取值一千点~( 最快可到两千点...)
来源讯号为Sine ...
如果使用取一点标一点速度很明显跟不上 ( 50ms顶多取一点 )
所以目前皆使用取满一个Buffer=1000点的值在一次显示
但是速度有比较好一点~但是绘图似乎也跟不上
常会出现取值时间不固定,波形很丑的情况(歪歪的SINE波形 )
似乎在取值的时间上有落差(并不是每1ms就去取一个点...会因为其他UI的事件造成delay)
取值的方法我是使用Backgroundworker
private void BG_Worker2_DoWork(object sender, DoWorkEventArgs e)
{
for (; ; )
{
if (BG_Worker2.CancellationPending)
{
e.Cancel = true;
break;
}
else
{
//取点 .... IR_Buf 为存取点数 , DrawPointCt=设定点数,取多少点更新一次图,点为浮点值
IR_Buf[DrawPontCt, 0] = Demo_RData[0];
IR_Buf[DrawPontCt, 1] = Demo_RData[1];
IR_Buf[DrawPontCt, 2] = Demo_RData[2];
IR_Buf[DrawPontCt, 3] = Demo_RData[3];
.....
.....
.....
if (DrawPontCt == PointCt - 1) //点数取满後
{
DrawPontCt = 0;
if (Draw_already)
{
Draw_Buf_Ok = true;
if (BG_Woker1.IsBusy)
{ }
else
{
BG_Woker1.RunWorkerAsync();
}
}
}
else
{ //
DrawPontCt++;
Draw_Buf_Ok = false;
}
//若在此使用 sleep (1ms) ....效能会剩下100点/1秒
//Application.DoEvents();
//Thread.Sleep(1);
//所以要固定时间取值要使用for回圈来做延迟吗
for (int i = 0; i < Delay; i++) //
{ }
}
}
}
请问再取值的方式上是否要做什麽改正?
如果要精确做到( 一点 / 1ms 取值如何实现? )
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.252.94.126
1F:→ proach:PC是多工系统,要特殊功能,像是录音,才能保证取样时间吧 10/24 12:52
2F:→ vencin1987:或许你要DROP掉一些 10/24 19:50