关于 读取配置数据丢失的问题
辉歌 2003-10-16 05:24:08 关于 读取配置数据丢失的问题
现在有一个很奇怪的问题。如下:
我在程序里用了两个CArray,
CArray arrayData;//保存当前正在使用的配置数据,
CArray arrayBak; //记录用户在界面上更新的配置情况。
这两个数据都是在程序启动时,读取配置文件。分别读取两次,第一次读入到arrayData中,第二次读入到arrayBak中。
然后程序运行,当退出时,将arrayBak中的数据保存。
可是现在出现的情况是,有时候数据可以正常保存和读取,可是由于程序是24×7运行的,可能程序会出现错误死掉,然后看门狗会重启计算机。由于以前就出现了这个情况,所以我们用了一个土方法,每次计算机重启后,将备份的正确的配置文件拷贝一次。可是有时,该程序读取的数据竟然丢了数据,导致出现大量错误。
有大虾碰到过这样的情况吗?
代码如下:
void LoadSwData(void)
{
//added by Guocongsong
//LoadAdslAdjustValue(); 在LoadCfgData中调用
CString strFileName;
CFile file1,file2;
WORD wSwNumber = 0;
strFileName.LoadString(IDS_SWCFGFILENAME);
if(!file1.Open(strFileName,CFile::modeRead))
{
file1.Open(strFileName,CFile::modeCreate | CFile::modeWrite);
file1.Write(&wSwNumber,2);
file1.Close();
file1.Open(strFileName,CFile::modeRead);
}
CArchive ar0( &file1, CArchive::load,MAX_AR_BUFFER_SIZE);
ar0.Close();
CArchive ar1( &file1, CArchive::load,MAX_AR_BUFFER_SIZE);
ar1>>wSwNumber;
for(WORD w=0;w<wSwNumber;w++)
{
CSwitch* pSw = new CSwitch;
ar1 >> *pSw;
pSw->lTouchEleLine *= 1000;
pSw->lMixWithOthers *= 1000;
pSw->lEarth *= 1000;
pSw->lABLineBadInsulsion *= 1000;
pSw->lMixWithSelf *= 1000;
pSw->lMaxErrBetweenTwoVMeasure *= 1000;
pSw->lMaxErrBetweenTwoRMeasure *= 1000;
int j = pSw->phonePre.GetSize();
for(int i=0;i<j;i++)
{
Prefix* pre1 = new Prefix;
Prefix* pre2 = (Prefix*)pSw->phonePre[i];
memcpy(pre1->prefix,pre2->prefix,8);
pre1->prefix_len = pre2->prefix_len;
pre1->phone_len = pre2->phone_len;
pre1->swNo = pre2->swNo;
pre1->testDevType = pre2->testDevType;
pre1->devNo = pre2->devNo;
pre1->file = NULL;
arrayPrefix.Add(pre1);
}
//added by Guocongsong
CAdslAdjust *pAdjust;
pAdjust = AdslAdjust(pSw->no);
if (pAdjust != NULL)
{
//pSw->m_lLength = pAdjust->m_lLength;
//pSw->m_lAttention = pAdjust->m_lAttention;
//pSw->m_lMLen = pAdjust->m_lMLen;
pSw->lAdslCag = pAdjust->lAdslCag;
pSw->lAdslCbg = pAdjust->lAdslCbg;
pSw->lAdslCab = pAdjust->lAdslCab;
pSw->lAdslLossAt300k = pAdjust->lAdslLossAt300k;
pSw->lAdslLossAt1104k = pAdjust->lAdslLossAt1104k;
pSw->lAdslUpStream = pAdjust->lAdslUpStream;
pSw->fAdslDownStreamA = pAdjust->fAdslDownStreamA;
pSw->lAdslDownStreamB = pAdjust->lAdslDownStreamB;
pSw->lAdslLength = pAdjust->lAdslLength;
pSw->lAdslLB = pAdjust->lAdslLB;
}
arraySwitch.Add(pSw);
if(pSw->cReserved[0]!=0)
arrayONetSwitch.Add(pSw); ///zws!!
}
ar1.Close();
file1.Close();
file2.Open(strFileName,CFile::modeRead);
CArchive ar2( &file2, CArchive::load,MAX_AR_BUFFER_SIZE);
ar2>>wSwNumber;
for(w=0;w<wSwNumber;w++)
{
CSwitch* pSw = new CSwitch;
ar2 >> *pSw;
//added by Guocongsong
CAdslAdjust *pAdjust;
pAdjust = AdslAdjust(pSw->no);
if (pAdjust != NULL)
{
//pSw->m_lLength = pAdjust->m_lLength;
//pSw->m_lAttention = pAdjust->m_lAttention;
//pSw->m_lMLen = pAdjust->m_lMLen;
pSw->lAdslCag = pAdjust->lAdslCag;
pSw->lAdslCbg = pAdjust->lAdslCbg;
pSw->lAdslCab = pAdjust->lAdslCab;
pSw->lAdslLossAt300k = pAdjust->lAdslLossAt300k;
pSw->lAdslLossAt1104k = pAdjust->lAdslLossAt1104k;
pSw->lAdslUpStream = pAdjust->lAdslUpStream;
pSw->fAdslDownStreamA = pAdjust->fAdslDownStreamA;
pSw->lAdslDownStreamB = pAdjust->lAdslDownStreamB;
pSw->lAdslLength = pAdjust->lAdslLength;
pSw->lAdslLB = pAdjust->lAdslLB;
}
arraySwitchBak.Add(pSw);
}
ar2.Close();
file2.Close();
}