环境:VS2008 C# winform wince6.0
问题:现在需要开发wince6下的应用程序,其中需要绘制曲线。根据得到的数据大小,绘制不同的颜色的线条。但发现绘图的速度实在是太慢。private void DrawImage()
{
_rtClient = new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height);
if (_bPainting)
return;
_bPainting = true; if (_gBmp == null)
{
_gBmp = new Bitmap(_rtClient.Width, _rtClient.Height);
_g = Graphics.FromImage(_gBmp);
}
_g.Clear(Color.White); int cyc = 64 * 50; //需要绘制的线条数
int colorIndex=0;
for (int i = 0; i < cyc; i++)
{
colorIndex = GetColorIndex(i); //根据每个数据的不同,得到不同的颜色,然后绘制竖线
_g.DrawLine(_colorPen[colorIndex], _rtClient.Left + i * _rtClient.Width / cyc, _rtClient.Top + 10, _rtClient.Left + i * _rtClient.Width / cyc, _rtClient.Bottom - 10);
}
pictureBox1.Image = _gBmp;
pictureBox1.Refresh();
_bPainting = false;
}
以上测试的代码,运行需要2s左右一次,界面完全卡死了,求大神,有没有好点的方法,加快绘图速度啊,使得速度在200ms以内。WinCEC#绘图
问题:现在需要开发wince6下的应用程序,其中需要绘制曲线。根据得到的数据大小,绘制不同的颜色的线条。但发现绘图的速度实在是太慢。private void DrawImage()
{
_rtClient = new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height);
if (_bPainting)
return;
_bPainting = true; if (_gBmp == null)
{
_gBmp = new Bitmap(_rtClient.Width, _rtClient.Height);
_g = Graphics.FromImage(_gBmp);
}
_g.Clear(Color.White); int cyc = 64 * 50; //需要绘制的线条数
int colorIndex=0;
for (int i = 0; i < cyc; i++)
{
colorIndex = GetColorIndex(i); //根据每个数据的不同,得到不同的颜色,然后绘制竖线
_g.DrawLine(_colorPen[colorIndex], _rtClient.Left + i * _rtClient.Width / cyc, _rtClient.Top + 10, _rtClient.Left + i * _rtClient.Width / cyc, _rtClient.Bottom - 10);
}
pictureBox1.Image = _gBmp;
pictureBox1.Refresh();
_bPainting = false;
}
以上测试的代码,运行需要2s左右一次,界面完全卡死了,求大神,有没有好点的方法,加快绘图速度啊,使得速度在200ms以内。WinCEC#绘图
解决方案 »
- 找网络编程的资料
- C#异常处理怎么会有两种不同的结果
- C#.NET中怎么实现5秒钟跳转的功能?其中时间会呈现倒计时的形式。
- 基于多线程局域网扫描
- 关于继承,工厂类,接口
- 使用 ToolTip 控件是遇到了一个问题
- 請高手批評指教!!(100分)
- 请问怎样将这正则的贪婪匹配改变成最短匹配,谢谢
- 请教各位C#中如何生成GUID啊?????
- 请问实现socket(C#)通信,定义tcp/ip协议或者xml协议,哪种方便?
- string.Format 问题
- 未能加载文件或程序集“MyDbAdapters”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
ui去调。
绘图数据是直接获取的,计算时间很短。
关键是for循环,耗时很大。
因为这是在wince下,在电脑上运行的时候很流畅的。
绘图数据是直接获取的,计算时间很短。
关键是for循环,耗时很大。
因为这是在wince下,在电脑上运行的时候很流畅的。
绘图数据是直接获取的,计算时间很短。
关键是for循环,耗时很大。
因为这是在wince下,在电脑上运行的时候很流畅的。
for循环不是耗时的理由,无论是什么循环,最终被编译后还是线性执行的。
对于wince不太了解,但肯定还有其他原因。
内存里面画出来再现在 系统api不记得了
SendMessage(AddClientContrl.Handle, WM_SETREDRAW, 0, IntPtr.Zero);//禁止该控件显示SendMessage(AddClientContrl.Handle, WM_SETREDRAW, 1, IntPtr.Zero);
AddClientContrl.Refresh();[/code]
这个注释我自己写的 可能不对
刚才试验了下,没有效果啊!速度还是非常慢!
总耗时:2100 ms
for循环耗时:2070ms就是for循环里的画线太慢了!请教大神们,有没有更好的办法啊??
刚才试验了下,没有效果啊!速度还是非常慢!
总耗时:2100 ms
for循环耗时:2070ms就是for循环里的画线太慢了!请教大神们,有没有更好的办法啊??
不是沿着X轴画的,是在3维坐标下绘制的,每个点的X、Y都不一样,所以不能使用保存临时图片的方式,只有每次都完全重绘了。
画一张图片的时间就需要2s了,怎么准备第二张啊而且点也无法忽略掉,因为是在3维坐标下,X轴50个周期;Y轴表示每周期64点,即3200条竖线;Z轴为点大小
然后用invoke去实时的显示画出来的线条.
找了一段代码希望对你有所启发.using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;namespace listbox无阻塞运行
{
public partial class Form1 : Form
{
private readonly int Max_Item_Count = 10000; public Form1()
{
InitializeComponent();
} private void btn_Start_Click(object sender, EventArgs e)
{
new Thread((ThreadStart)(delegate()
{
for (int i = 0; i < Max_Item_Count; i++)
{
// 此处警惕值类型装箱造成的"性能陷阱"
listView1.Invoke((MethodInvoker)delegate()
{
listView1.Items.Add(new ListViewItem(new string[] { i.ToString(), string.Format("This is No.{0} item", i.ToString()) }));
Thread.Sleep(100);
}); };
}))
.Start(); }
}
}