我的程序中设置了一个定时器,定时器响应函数完成对数据库的读写并向远端发送数据(通信)。可我在网上再用asp页面从数据库中读数据时发现时间字段总是不能正确显示,出现2004-6-30 18:36:36,或者是2004-06-30 18:36:6的情况。从数据库中发现数据库的时间字段也是错的。
我想请问:是不是因为中断响应函数中的操作耗时比系统时间更新间隔要长,导致系统时间混乱?如果是这种问题该如何解决呢?
急盼高手相助!!!在线等待
我想请问:是不是因为中断响应函数中的操作耗时比系统时间更新间隔要长,导致系统时间混乱?如果是这种问题该如何解决呢?
急盼高手相助!!!在线等待
我们当时写的是b/c/s结构的,和你差不多。
相当于聊天程序,网页和客户段结合的聊天。
系统时间会停摆的,比方你用轮询方式读写端口时,最简单的就是做个长时间的循环
windy2004(风筝):
我的理解是:
设置定时器相当于开辟一个线程,当满足时间条件时激活,默认MFC里OnTimer函数响应;你可 以在OnTimer里通知写线程.
现在改成
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程序的内存是怎么获得的,难道不是系统自动分配的吗?为什么长时间运行就出错呢?要怎样解决呢?
出现内存不足的原因是因为你没有释放内存,导致这个程序使用的内存超过了2G 。看看是不是线程里面用了new ,用完了又没有delete。
呵呵,要不就是你的系统虚拟内存不足了,程序分配不了足够的内存了。
是不是及时的释放空间另外AfxEndThread也不用。
void CTalkDlg::OnTimer(UINT nIDEvent)
{
AfxBeginThread(thread,this);
CDialog::OnTimer(nIDEvent);
}
UINT thread(LPVOID p)
{
((CTalkDlg*)p)->GetOperations();
return 0;
}
"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发送消息函数,应该跟整个网络质量有关吧!
0L;其实就是 long i=0;return i;因为返回类型为UINT吗,
当return是线程就结束了。不用那个函数。
可以用Studio工具下的spy++查看线程。GetOperation我看没有问题。函数内千万别出现阻止进程停止的消息,你可以把错误
信息写入ListBox供用户查看,另外,在线程中不要UpdateData这样的函数。而是用
WinAPI或系统函数代替。数据库取系统时间不用程序插入,而是用mssql本身的函数GetDate();
例如
insert into abc(idd, curtime) values(222, GetDate());可能我没有机会再说话了,好像只能三次吧。
说实在话,Release()我用着一直没有问题的,出现的警告。
我个人认为必须消除。
LINK : warning LNK4089: all references to "SHELL32.dll" discarded by /OPT:REF
这是什么意思
翻译过来应该是“所有与shell32.dll相关的都被拒”
那反映了程序的什么方面出了问题呢
sorry!
可以调用老c中的实施参照函数,直接参照系统时间。