我的程序获得一些实时变化数据,我想在窗口里面显示这些实时变化的数据,请问该如何写代码啊?

解决方案 »

  1.   

    使用定时器的方法比较简单,通常告诉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)来取消定时器。
      

  2.   

    前辈整理的,找莱给你看看 希望有所帮助!基础类
    时间控制函数 
     
    传统的方法使用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秒发送一个定时消息,有时定时就是近似的,并不完全精确。  
      

  3.   

    用线程来实现吧,定时器不稳定,因为windows会对线程分配时间片(这是一定的),定时器有时会丢。在线程里面收到数据就把它显示出来。
      

  4.   

    你就在定时器里面做显示呗  看你用什么显示了 edit框就用 updatedate(true)