首先为对话框添加了消息处理函数
void CtestDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
//一些操作
         CDialog::OnTimer(nIDEvent);
}
然后在对话框的初始化程序initDialog中设置了定时器SetTimer(NULL,NULL,10000,NULL)
每隔10s执行一次OnTimer的操作,但是程序变得异常缓慢,如果设置的时间间隔大一点,就快一点。
但是,我需要设置为10s。另外,我也试了SetTimer用回调函数的办法,出现了同样的问题。各种纠结中……,跪求各位大神指导,感激涕零
MFC 对话框定时器

解决方案 »

  1.   

    你得把ontimer里做了写什么事贴出来啊,不然谁知道啥原因啊
      

  2.   

    嗯,肯定是你OnTimer里面程序的问题,而不是OnTimer时间的原因
      

  3.   

    恩,看看ontimer里面你做了什么事情,也许陷在里面了
      

  4.   

    你试下OnTimer里面什么都别做 你看下卡不卡就知道是哪里卡了...
      

  5.   

    CWnd::SetTimer 
    UINT_PTR SetTimer(
       UINT_PTR nIDEvent,
       UINT nElapse,
       void (CALLBACK* lpfnTimer
    )(HWND,
       UINT,
       UINT_PTR,
       DWORD

    );
    nIDEvent那个参数请设置为非0值
      

  6.   

    感谢楼上各位兄弟姐妹,按照你们的提示,发现确实是OnTimer中的操作引起的问题!但是我没找出来问题在哪,麻烦各路英雄再帮我看一下。
    void CtestDlg::OnTimer(UINT_PTR nIDEvent)
    {
    // TODO: Add your message handler code here and/or call default
        if(CheckInternetConnection)
       {
          MessageBox("请断开网络连接","");
       }
             CDialog::OnTimer(nIDEvent);
    }
    BOOL CheckInternetConnection()
    {
        WSADATA wsaData;
        WORD wVersionRequested = MAKEWORD(2,2);
        int nRet; // Init WinSock
        nRet = WSAStartup(wVersionRequested, &wsaData);
        if (nRet)
        {
    // return FALSE;
        }
    // Check version
    if (wsaData.wVersion != wVersionRequested)
    {
    // return FALSE;
    } // Go do the ping
    if (Ping("www.sina.com.cn")||Ping("www.163.com"))
    {
    WSACleanup();
    return TRUE;
    }
    // Free WinSock
        WSACleanup();
    return FALSE;
    }BOOL Ping(LPCSTR pstrHost)
    {
    SOCKET   rawSocket;
    LPHOSTENT lpHost;
    struct    sockaddr_in saDest;
    struct    sockaddr_in saSrc;
    DWORD   dwTimeSent;
    DWORD   dwElapsed;
    u_char    cTTL;
    int       nLoop;
    int       nRet; // Create a Raw socket
    rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
    if (rawSocket == SOCKET_ERROR) 
    {
    return FALSE;
    }

    // Lookup host
    lpHost = gethostbyname(pstrHost);
    if (lpHost == NULL)
    {
    return FALSE;
    }

    // Setup destination socket address
    saDest.sin_addr.s_addr = *((u_long FAR *) (lpHost->h_addr));
    saDest.sin_family = AF_INET;
    saDest.sin_port = 0; // Ping multiple times
    for (nLoop = 0; nLoop < 2; nLoop++)
    {
    // Send ICMP echo request
    SendEchoRequest(rawSocket, &saDest); // Use select() to wait for data to be received
    nRet = WaitForEchoReply(rawSocket);
    if (nRet == SOCKET_ERROR)
    {
    return FALSE;
    }
    if (!nRet)
    {
    return FALSE;
    } // Receive reply
    dwTimeSent = RecvEchoReply(rawSocket, &saSrc, &cTTL); // Calculate elapsed time
    dwElapsed = GetTickCount() - dwTimeSent;
    }
    nRet = closesocket(rawSocket);
    return TRUE;
    }单次执行checkInternetConnection是没有问题的。
    我的目的就是定时检测有没有联网,如果联网,就提示断开网络连接。
    求帮助!
      

  7.   

    启动一个线程 后台执行CheckInternetConnection
      

  8.   

     进入之后先将timr给杀掉
    好像是deletetimer类似的。//一些操作
             CDialog::OnTimer(nIDEvent);
    然后再执行完后重新settimer
      

  9.   

    找到原因了,是因为我执行checkInternetConnection耗时需要将近10s。ping命令本身就需要耗时。
    有没有比较快的检测联网状态的方法!
      

  10.   

    不用找别的方法,应该开辟一个子线程做看门狗CreateThread(...),网路监测的耗时再长也能不会影响你的主程序。