请问如何显示实时数据?

e_ego 2005-12-15 11:41:38
我的程序获得一些实时变化数据,我想在窗口里面显示这些实时变化的数据,请问该如何写代码啊?
...全文
228 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Seu_why 2005-12-15
  • 打赏
  • 举报
回复
说的满详细 鼓励一下 !
simaowufen 2005-12-15
  • 打赏
  • 举报
回复
使用定时器的方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。通常有两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。

1.1 用WM_TIMER来设置定时器

先请看SetTimer这个API函数的原型

UINT_PTR SetTimer(
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT uElapse, // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc // 回调函数
);

例如
SetTimer(m_hWnd,1,1000,NULL); //一个1秒触发一次的定时器
在MFC程序中SetTimer被封装在CWnd类中,调用就不用指定窗口句柄了,例如:

UINT SetTimer(1,100,NULL);
函数反回值就是第一个参数值1,表示此定时器的ID号。

第二个参数表示要等待100毫秒时间再重新处理一次。第三个参数在这种方法中一般用NULL。
注意:设置第二个参数时要注意,如果设置的等待时间比处理时间短,程序就会出问题了。

1.2 调用回调函数

此方法首先写一个如下格式的回调函数

void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime);
然后再用SetTimer(1,100,TimerProc)函数来建一个定时器,第三个参数就是回调函数地址。

二、多个定时器的实现与应用

我们在安装定时器时都为其指定了ID,使用多个定时器时,该ID就发挥作用了。
不使用MFC时,当接收到WM_TIMER消息,WPARAM wParam中的值便是该定时器的ID
使用MFC时就更简单了,我们为其增加WM_TIME的消息处理函数OnTimer即可,请看如下例子
void CTimerTestDlg::OnTimer(UINT nIDEvent)
{
switch (nIDEvent)
{
case 24: ///处理ID为24的定时器
Draw1();
break;
case 25: ///处理ID为25的定时器
Draw2();
break;
}
CDialog::OnTimer(nIDEvent);
}
当你用回调函数时,我们可以根据nTimerid的值来判断是哪个定时器,例如:
void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
{
switch(nTimerid)
{
case 1: ///处理ID为1的定时器
Do1();
break;
case 2: ///处理ID为2的定时器
Do2();
break;
}
}
三、取消定时器

不再使用定时器后,我们应该调用KillTimer来取消定时,KillTimer的原型如下

BOOL KillTimer(
HWND hWnd, // 窗口句柄
UINT_PTR uIDEvent // ID
);
在MFC程序中我们可以直接调用KillTimer(int nIDEvent)来取消定时器。
alexmayer 2005-12-15
  • 打赏
  • 举报
回复
帮顶混分!
e_ego 2005-12-15
  • 打赏
  • 举报
回复
在窗口里实时显示啊,数据边更新,边显示
skt01 2005-12-15
  • 打赏
  • 举报
回复
不知道你想怎么显示?
xx_jj 2005-12-15
  • 打赏
  • 举报
回复
你就在定时器里面做显示呗 看你用什么显示了 edit框就用 updatedate(true)
e_ego 2005-12-15
  • 打赏
  • 举报
回复
狂晕,问的不是定时的问题而是显示的问题!
handsame3 2005-12-15
  • 打赏
  • 举报
回复
用线程来实现吧,定时器不稳定,因为windows会对线程分配时间片(这是一定的),定时器有时会丢。在线程里面收到数据就把它显示出来。
e_ego 2005-12-15
  • 打赏
  • 举报
回复
我问的不是定时器的问题,而是实时显示数据!不知道该如何把实时变化的数据显示出来!还望高手指点
Seu_why 2005-12-15
  • 打赏
  • 举报
回复
前辈整理的,找莱给你看看 希望有所帮助!

基础类
时间控制函数

传统的方法使用WM_TIMER(),精度最低。
在要求不大于1毫秒的情况下,可以采用GetTickCount()函数,该函数的返回值是DWORD型,表示以毫秒为单位的计算机启动后经历的时间间隔。实现50毫秒精确定时方法:
DWORD dwstart,dwstop;
dwstop=GetTickCount();
while(TRUE)
{
dwstart=dwstop;
do{
dwstop=GetTickCount();
}while(dwstop-50<dwstart);
}
仅供WIN9X使用的高精度定时器:QueryPerformanceFrequency()和QueryPerformanceCounter(), 要求计算机从硬件上支持高精度定时器。函数的原形是:BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);
数据类型LARGEINTEGER既可以是一个作为8字节长的整数,也可以是作为两个4字节长的整数的联合结构,其具体用法根据编译器是否支持64位而定。该类型的定义如下:typeef union _ LARGE_INTEGER
{
struct
{
DWORD LowPart;
LONG HighPart;
};
LONGLONG QuadPart;
} LARGE_INTEGER;
在定时前应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。接着在需要严格计时的事件发生前和发生之后分别调用QueryPerformanceCounter(), 利用两次获得的计数之差和时钟频率, 就可以计算出事件经历的精确时间。测试函数SLEEP(100)的精确持续时间方法:
LARGE_INTEGER litmp;
LONGLONG qt1,qt2;
double dft,dff,dfm;
QueryPerformanceFrequency(&litmp);//获得时钟频率
dff=(double)litmp.QuadPart;
QueryPerformanceCounter(&litmp);//获得初始值
qt1=litmp.QuadPart;Sleep(100);
QueryPerformanceCounter(&litmp);//获得终止值
qt2=litmp.QuadPart;
dfm=(double)(qt2-qt1);
dft=dfm/dff;//获得对应的时间值
需要注意的是DFT计算的结果单位是秒。

//----------------------------------------------------------------------------------------
取得系统时间

方法:
SYSTEMTIME systime;
::GetSystemTime(&systime);
CTime time(systime);

//----------------------------------------------------------------------------------------
使用定时器

定时器的时间单位是毫秒,数值是1-32位整数,最大的数字是49.5天左右。虽然可以设定间隔,但是因为硬件定时器是54.9毫秒为基准,所以设定的定时器都是每55秒发送一个定时消息,有时定时就是近似的,并不完全精确。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧