我正在发布模式下运行Visual C ++ MFC应用程序。我正在使用Visual Studio 2010编译所有内容。
我的应用程序通过USB VCP通信运行迷你CNC铣床。
我有一个存储应用程序设置的XML文件。
我的问题是:ocassionaly(这是可重复的)指向我正在使用的tinyxml2 :: XMLDocument的指针设置为0x000。
的信息:
有时,在工厂运行时会写入XML文件。
在错误发生之前,我正在运行的磨机扫描了近30秒。
我正在使用互斥锁来确保xmldoc不会一次写入文件两次。
互斥锁正在工作,永远不会发生互斥锁错误。我知道互斥代码并不完美,但这不是问题。诚实。
除非父类正在启动,否则我永远不会写入xmldoc指针。
然后,突然间,xmlDoc指针被设置为零。
有人想过吗?
这是我的保存代码,虽然问题可能出在其他地方:
void XMLSettings::SaveToXML()
{
HANDLE g_Mutex = CreateMutex( NULL, TRUE, "XMLSavingMutex");
DWORD wait_success = WaitForSingleObject( g_Mutex, 30000L);
if(wait_success == WAIT_OBJECT_0){
CIsoProApp* pApp = (CIsoProApp*)AfxGetApp();
if(PathFileExists(pApp->DrivePath + "IsoPro\\temp.xml"))
{
DeleteFile(pApp->DrivePath + "IsoPro\\temp.xml");
}
if(0==&xmlDoc)
{
OutputDebugString("xmlDoc == NULL");
}
int errorcode = xmlDoc->SaveFile(pApp->DrivePath + "IsoPro\\temp.xml");
if(errorcode != 0)
{
OutputDebugString("xmlDoc == errorcode");
}
if(0==&xmlDoc)
{
OutputDebugString("xmlDoc == NULL2");
}
if(0==xmlDoc)
{
OutputDebugString("xmlDoc == NULL");
}
if(PathFileExists(pApp->DrivePath + "IsoPro\\Settings.xml"))
{
DeleteFile(pApp->DrivePath + "IsoPro\\Settings.xml");
}
MoveFile(pApp->DrivePath + "IsoPro\\temp.xml",pApp->DrivePath + "IsoPro\\Settings.xml");
ReleaseMutex(g_Mutex);
}
else
{
int errorInt = GetLastError();
CString error;
error.Format("%d",errorInt);
if(errorInt != ERROR_ALREADY_EXISTS)
{
AfxMessageBox("XMLSavingMutex Error. WaitSuccess = " + wait_success);
AfxMessageBox("XMLSavingMutex Error. GetLastError = " + error);
}
}
CloseHandle(g_Mutex);
}
答案 0 :(得分:1)
由于您每次调用 SaveToXML
似乎都在创建互斥锁,因此您应该将呼叫更改为
HANDLE g_Mutex = CreateMutex( NULL, FALSE, "XMLSavingMutex");
执行此操作将创建一个命名的互斥锁,允许实现指定所有者是谁;其他线程将收到相同的互斥锁。
来自doc:
两个或多个进程可以调用
CreateMutex
来创建相同的命名互斥锁。第一个进程实际上创建了互斥锁,具有足够访问权限的后续进程只需打开现有互斥锁的句柄。这使得多个进程可以获得相同互斥锁的句柄,同时使用户无需确保首先启动创建过程。使用此技术时,应将bInitialOwner
标志设置为FALSE
;否则,可能很难确定哪个流程具有初始所有权。
(归功于WhozCraig指出了指定的互斥锁)
答案 1 :(得分:0)
在将xml写入文件时,我似乎正在访问xml getter。我为所有xml操作放置了一个互斥锁,事情似乎正常运行。感谢大家的帮助。如果可用,我会与更多信息保持联系。