4282|9

53

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

用EVC5.0做绘制实时数据曲线(每秒采集一次数据),为何不能自动刷新? [复制链接]

用EVC5.0做绘制实时数据曲线(每秒采集一次数据),运行时为何不能自动刷新?
而在VC下编译、运行却没有任何问题。

最新回复

但是同样的代码,为什么在VC下就可以刷新,在EVC下却不行。 这个程序代码是我在网上找的,改了改基本可以用了,但在EVC下却出现了这个问题, 同样,我用Sleep()定时,用OnTime()响应的方法,自己又写了一个动态采集数据的程序, 却可以刷新屏幕。我就搞不懂到底上面这程序是什么地方出问题了。   详情 回复 发表于 2008-4-18 15:00
点赞 关注

回复
举报

83

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
没有eVC5.0吧?!   

没有代码让大家怎么看呢?  如果采用GDI编程的话,应该是一样的, 具体代码具体分析吧

 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
哦,对不起,是EVC4.0
我用动态链接库实现了画坐标系(横轴、纵轴)、画曲线、文件存储等功能;
在MFC下,用SetTimer设置计时器为1秒,在OnTimer中调用动态链接库实现每一秒绘图一次。
在VC中运行时没有任何问题,移植到EVC下无法自动刷新(将程序最小化然后再最大化可以看出曲线已经移动了)。
void CDView::OnInitialUpdate()
{
       
        CRect Rect;
        GetClientRect(Rect);
        m_Plot.Create(WS_CHILD|WS_VISIBLE,Rect,this,12000);//

         ......

        SetTimer(1,1000,NULL);//设置计时器时间为1秒
        canSize=TRUE;
CView::OnInitialUpdate();
}

void CDView::OnTimer(UINT nIDEvent) //捕获时间
{
        // TODO: Add your message handler code here and/or call default
        static BOOL pros={FALSE};
        if(!pros){
                pros=TRUE;
                {
                double y=(double)(sin(xxx)*10+10);
                m_Plot.AddPoint(0,  CTime::GetCurrentTime(), y);//在动态链接库中实现画新的曲线
                }
                {
                //double y =(double)(abs(rand())%200);
                double y=(double)(cos(xxx)*10+10);
                m_Plot.AddPoint(1,  CTime::GetCurrentTime(), y);
                }
/*                {
                double y =(double)(abs(rand())%200);
                m_Plot.AddPoint(2,  CTime::GetCurrentTime(), y);
                }
*/                {
                //double y =(double)(abs(rand())%2000);
                double y=10.0;
                m_Plot.AddPoint(3,  CTime::GetCurrentTime(), y);
                }
                Invalidate();
                pros=FALSE;
                xxx+=10*3.1415926*2/360;
        }
        CView::OnTimer(nIDEvent);
}
上面两段代码是MFC中调用动态链接库的函数代码。根据运行结果来分析,动态链接库中应该没什么问题,
是不是这段代码中出现了问题。
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

4
 
UpdateWindow();
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

5
 
static BOOL pros={FALSE};是什么意思?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
如果是代码没有问题的吧.

我猜测估计是定时器的问题,在ce里面OnTimer的优先级别很低,
如果当时你一直在频繁的采集数据或者进行SendMessage or PostMessage操作的时候.OnTimer就很容易得不到响应.

如果是这样的话,尽量少用Message ,或者可以用线程来代替OnTimer...
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

7
 
程序运行之后,要是将窗口最小化然后再最大化,可以看到图象确实显示到了屏幕上,并且显示是正确的,
但是如果不切换界面的话,图象就不会更新。
这是不是可以说明在OnTime()内的程序得到了执行,但不知道是什么原因使得图象无法自动刷新,
我觉得这可能是如下几个原因之一:

1、是不是和WINDOWS CE系统的实时性有关系?
2、是不是每次画横、纵坐标(象表格一样的坐标)、画曲线时间太长(甚至可能超过了一秒???),系统无法及时响应程序的执行?
3、或者是5楼大哥说的OnTime的优先级太低,无法及时响应?
4、别的什么原因?


小弟初学EVC时间不长,对EVC运行机制还不是特别熟悉,微软提供的有些函数不太会用,希望高手能够指点迷津,帮我解决难题。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

8
 
Invalidate();  这个是不是要在m_Plot去刷新啊,改成 m_Plot.Invalidate();  
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 
那应该是没触发刷屏。这种问题很好解决,你DEBUG,切切断点就可以搞定了。
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

10
 
但是同样的代码,为什么在VC下就可以刷新,在EVC下却不行。
这个程序代码是我在网上找的,改了改基本可以用了,但在EVC下却出现了这个问题,
同样,我用Sleep()定时,用OnTime()响应的方法,自己又写了一个动态采集数据的程序,
却可以刷新屏幕。我就搞不懂到底上面这程序是什么地方出问题了。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表