none
C# 窗体应用程序画图 RRS feed

  • 问题

  • 我想用C# 窗体应用程序编写一个画图软件,用于查看特定格式的数据,一次从数据文件读入500MB数据,分为6条曲线显示,每条曲线每屏显示32768个点,现在打算用自带的chart控件,但无论是读入数据文件还是画图,都非常“卡”,要等待一段时间才能完成,要想解决这些问题应该如何处理?
    2017年1月17日 4:33

全部回复

  • Hi wwwmgl,

    感谢你在MSDN论坛发帖。

    这个绘图过程你是放在UI线程里面的吗?如果是我建议你在开一个线程来做绘图操作,这样会缓解UI线程的压力。因为在UI线程在默认的情况下,就是主线程。如果UI线程一直在都在绘,这样会导致界面很卡。

    如果你的问题已经被解决,请及时标记拥有的回复作为答案,这样会帮助遇到相同问题的人。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年1月17日 7:04
    版主
  • 可否改成异步模式来实现(BackgroundWorker)绘图。

    分成6条线显示,可否开6个线程,每个线程完成自己的绘图任务。

    还有一个建议,画图前先SuspendedRedraw,绘制完成后再ResumeRedraw,避免界面频繁刷新带来的性能问题。


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2017年1月17日 7:31
  • 这个问题我也考虑过,但是现在从文件读入数据并换算成指定格式也要花费很长时间
    2017年1月17日 8:47
  • 我是用Chart控件画图,

     chart1.Series[0].Points.DataBindY(ch1);    将数据绑定到曲线

    这样也需要SuspendedRedraw和ResumeRedraw吗,另外有相关的例子吗

    2017年1月17日 8:51
  • Hi,

    我觉得你可以把这些点的绘制过程,放在后台线程,绘制好了以后,在显示这些数据,这样就不会那么卡了。

    就与显示视频数据一样,都是事先把视频数据解码好,放在队列里面去,都按照一定的顺序排放好,在通知显示线程来显示数据,流畅度很高。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年1月18日 7:39
    版主
  • 一次读取500MB的原始数据到内存,里面包含6条曲线,每条曲线32768个点,合计196608个点。同时需要对原始数据进行转换成指定的目标格式数据。“卡” 的原因可能有两种:1.内存不足,不断得去读写虚拟内存;2.绘制的图片很大,WINFROM的界面重绘时很耗费时间;3.格式转换个算法比较复杂,转换花费时间较多。

    楼上各位提到的多线程是其中一种解决方法,不过我认为题主应该考虑一下从多个环节来优化,下面提供几方面的思路供题主参考:

    1.考虑将数据预转换,即在你的程序读取之前就将格式转换好成你预先所要的格式,同时读取完之后及时释放IO;

    2.考虑减少读入数据的数量,如下文有缩放功能,可根据不同缩放级别读取不同的数据;

    3.绘制图片缓存,将不同屏的数据会成图片缓存起来,这样在再次滚动和缩放时无需二次绘制;

    4.考虑增加缩放与放大功能,通过算法将每条线的32768个点根据不同的缩放级别,优化成300个点(300个点只是举个实例,具体根据项目实际情况来定),这样不过造成GDI画图压力大,同时生成的图片也不会很大;

    5.考虑优化算法,比如一条线可以覆盖N个点,这时可以只绘制一条线;

    6.数据转换这块,对CPU和内存有一定要求,而GDI绘图对GPU有一定要求,因此也可以考虑增加硬件配置来缩短每个环节的处理时间。当然如果在局域网内使用,可以考虑使用一台较好的的图形处理服务器来专门处理数据,然后将处理好的最终数据传个终端显示即可;

    7.上面任何环节都可以考虑使用异步和多线程。

    希望上面建议对题主有所帮助。

    2017年1月25日 3:01