我的程序中设置了一个定时器,定时器响应函数完成对数据库的读写并向远端发送数据(通信)。可我在网上再用asp页面从数据库中读数据时发现时间字段总是不能正确显示,出现2004-6-30 18:36:36,或者是2004-06-30 18:36:6的情况。从数据库中发现数据库的时间字段也是错的。
我想请问:是不是因为中断响应函数中的操作耗时比系统时间更新间隔要长,导致系统时间混乱?如果是这种问题该如何解决呢?
急盼高手相助!!!在线等待

解决方案 »

  1.   

    我写过这样的程序没有出问题啊!你还是检查你vc插入到数据库的字段吧。
    我们当时写的是b/c/s结构的,和你差不多。
    相当于聊天程序,网页和客户段结合的聊天。
      

  2.   

    huang_yu(HY):
      系统时间会停摆的,比方你用轮询方式读写端口时,最简单的就是做个长时间的循环
    windy2004(风筝):
      我的理解是:
          设置定时器相当于开辟一个线程,当满足时间条件时激活,默认MFC里OnTimer函数响应;你可 以在OnTimer里通知写线程.
      

  3.   

    多谢各位高手热心相助!!!时间出错的问题最终证明是数据库时间字段的设置出了问题.不过,正如大家所说,我觉得设置定时器时,若响应函数耗时超过中断间隔,时间问题似乎还是有出错的隐患.不知各位高手意下如何???
    现在改成
    void CTalkDlg::OnTimer(UINT nIDEvent) 
    {
    // TODO: Add your message handler code here and/or call default
    AfxBeginThread(thread,0);
    CDialog::OnTimer(nIDEvent);}
    UINT thread(LPVOID p)
    {
    CTalkDlg*dlg=(CTalkDlg*)AfxGetApp()->GetMainWnd();
    dlg->GetOperations();
    AfxEndThread(0);
    return 0;
    }
    不知这样能不能解决隐患
    另外还有个问题:程序若长时间运行,比如说一整晚,中途会出现"netboxtest内存不足,已退出"
    那么想请教大家:vc程序的内存是怎么获得的,难道不是系统自动分配的吗?为什么长时间运行就出错呢?要怎样解决呢?
      

  4.   

    windows本来就不是实时系统,定时只能得到一个大概的时间,跟你系统设置和CPU的使用率有关。系统的资源被利用的越多,定时时间越不准。
    出现内存不足的原因是因为你没有释放内存,导致这个程序使用的内存超过了2G 。看看是不是线程里面用了new ,用完了又没有delete。
    呵呵,要不就是你的系统虚拟内存不足了,程序分配不了足够的内存了。
      

  5.   

    最主要的thread函数中的GetOperations会不会占有很大的内存,
    是不是及时的释放空间另外AfxEndThread也不用。
    void CTalkDlg::OnTimer(UINT nIDEvent) 
    {
    AfxBeginThread(thread,this);
    CDialog::OnTimer(nIDEvent);
    }
    UINT thread(LPVOID p)
    {
    ((CTalkDlg*)p)->GetOperations();
    return 0;
    }
      

  6.   

    oh, return 0;  ------> return 0L;
      

  7.   

    layer781010(为了爱) :
        "return 0;  ------> return 0L;"  0L是什么意思,为什么要这样写
        为什么“AfxEndThread也不用”呢?不需要结束线程吗?我怎样才能及时释放空间呢?线程中调用的函数是进行数据库的读写并与远端通信的。
    void CTalkDlg::GetOperations()
    {
    ::CoInitialize(NULL);
    _ConnectionPtr MyDb;
    _RecordsetPtr MySet;
    _variant_t var;
    CString strFLAG,strCODE;
        MyDb.CreateInstance(__uuidof(Connection));
    MySet.CreateInstance(__uuidof(Recordset));
    try
    {

    MyDb->Open("DSN=boss","","",adModeUnknown);
    MySet->Open("SELECT * FROM control", MyDb.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
    while(!MySet->adoEOF)
    {
    var=MySet->GetCollect("state");
    if(var.vt!=VT_NULL)
    {
    strFLAG=(LPCSTR)_bstr_t(var);

    if(!strFLAG.Compare("0"))   //若标志位为0,则显示该命令
    {
    var=MySet->GetCollect("control");
    if(var.vt!=VT_NULL)
    {
    strCODE=(LPCSTR)_bstr_t(var);
    m_strMsg.Format("%s",strCODE);
    UpdateData(FALSE); //update dialog
    OnSendMsg();

    MySet->PutCollect("state",_variant_t((long)1));
    //确定在什么时候改写flag
    MySet->Update();
    MySet->MoveLast();
    }
    }
    MySet->MoveNext();

    }
    }
    //AfxMessageBox("save");
    MySet->Close();
    MyDb->Close();
    //AfxMessageBox("chenggongFASONG");
    }
    catch(_com_error e)
    {
    CString str;
    str.Format("%s",e.ErrorMessage());
    AfxMessageBox(str);
    }

    MySet=NULL;
    MyDb=NULL;
    ::CoUninitialize();
    }
    线程中就是调用上面的getoperations(),定时器的时间间隔是10秒,这个getoperations不知会耗时多久,其中包含一个onsend发送消息函数,应该跟整个网络质量有关吧!    
      

  8.   

    to  windy2004(风筝):
    0L;其实就是 long i=0;return i;因为返回类型为UINT吗,
    当return是线程就结束了。不用那个函数。
    可以用Studio工具下的spy++查看线程。GetOperation我看没有问题。函数内千万别出现阻止进程停止的消息,你可以把错误
    信息写入ListBox供用户查看,另外,在线程中不要UpdateData这样的函数。而是用
    WinAPI或系统函数代替。数据库取系统时间不用程序插入,而是用mssql本身的函数GetDate();
    例如
    insert into abc(idd, curtime) values(222, GetDate());可能我没有机会再说话了,好像只能三次吧。
      

  9.   

    再发一遍试试:
    说实在话,Release()我用着一直没有问题的,出现的警告。
    我个人认为必须消除。
      

  10.   

    那要怎么样消除呢?
    LINK : warning LNK4089: all references to "SHELL32.dll" discarded by /OPT:REF
    这是什么意思
    翻译过来应该是“所有与shell32.dll相关的都被拒”
    那反映了程序的什么方面出了问题呢
      

  11.   

    可以查看vc中的Option,
    sorry!
      

  12.   

    Timer函数也是信息机制,操作耗时长了在windows注册表里积压造成时间不准。
    可以调用老c中的实施参照函数,直接参照系统时间。