从这里拍摄:http://xerces.apache.org/xerces-c/faq-parse-3.html#faq-6
当一个进程中存在两个或多个解析器实例时,可以同时使用这些实例,而无需外部同步。也就是说,在包含两个解析器和两个线程的应用程序中,可以在第一个线程中同时运行一个解析器,而在第二个线程中运行第二个解析器。
但是,当QMutex被注释时,下面的代码就会失败,而当它被使用时就不会失败。
bool reports::validateSchema( QString fileName )
{
// QMutexLocker lock( &xercesMutex );
try
{
XMLPlatformUtils::Initialize();
}
catch(...)
{
this->throw_report_exception(__FILE__,__LINE__,__TIME__,__DATE__,"reports::validateSchema",
"unable to initialize Xerces Plateform");
return false;
}
const char* const xsd = "full absloute path to .xsd ==> hard written";
XercesDOMParser* parser = new XercesDOMParser();
try
{
parser->setValidationSchemaFullChecking(true);
parser->setDoSchema(true);
parser->setDoNamespaces(true);
parser->setValidationConstraintFatal(true);
parser->setValidationScheme(XercesDOMParser::Val_Auto);
ParserErrorHandler errHandler;
parser->setErrorHandler(&errHandler);
parser->cacheGrammarFromParse(true);
parser->loadGrammar(xsd,Grammar::SchemaGrammarType,true);
parser->parse(fileName.toStdString().c_str());
std::cout << parser->getErrorCount() << std::endl;
if(parser->getErrorCount()!=0)
{
return false;
}
}
catch (const XMLException& toCatch)
{
char* message = XMLString::transcode(toCatch.getMessage());
std::cout << "Exception message is: \n"
<< message << "\n";
XMLString::release(&message);
return false;
}
catch (const DOMException& toCatch)
{
char* message = XMLString::transcode(toCatch.msg);
std::cout << "Exception message is: \n"
<< message << "\n";
XMLString::release(&message);
return false;
}
catch (...)
{
std::cout << "Unexpected Exception \n" ;
return false;
}
delete parser;
XMLPlatformUtils::Terminate();
return true;
}我错过了什么?
函数被执行了数百次,并且在某个时候,我从以下两种方法中得到了一个分段错误:
XercesDOMParser* parser = new XercesDOMParser();或
parser->loadGrammar(xsd,Grammar::SchemaGrammarType,true);发布于 2013-10-30 13:20:46
引用您所指的同一个常见问题回答:
应用程序还需要确保XMLPlatformUtils::Initialize()和XMLPlatformUtils::Terminate()方法是从同一个线程调用的(通常是执行main()的初始线程),或者在多个线程同时调用XMLPlatformUtils::Initialize()和XMLPlatformUtils::Terminate()时执行适当的同步。
https://stackoverflow.com/questions/19585080
复制相似问题