Есть классик CDataBaseEx : public CDatabase.
У него есть функция GetDataFromTable
{
CRecordset* pRecordset = 0;
m_MainCS.Lock();
try
{
pRecordset = new CRecordset(this);
// Do SMTH
}
catch (CDBException* pDBE)
{
m_MainCS.Unlock();
// Do SMTH
}
catch (CMemoryException* pME)
{
m_MainCS.Unlock();
// Do SMTH
}
catch(CException* pE)
{
m_MainCS.Unlock();
// Do SMTH
}
catch(...)
{
m_MainCS.Unlock();
// Do SMTH
}
m_MainCS.Unlock();
}
При многопоточной работе через некоторое время в строке "pRecordset = new CRecordset(this);"
кидается исключение, которое ловится в секции "catch(...)"
После этого первый поток, который входит в критическую секцию m_MainCS
виснет в строке "pRecordset = new CRecordset(this);". Соответственно всё лочится.
Проявляется всё это исключительно в релизной версии.
Работать может всё это от 3х часов до нескольких суток..
Все таймауты на коннект и выполнение операций стоят по умолчанию 15 секунд.
Может быть кто-нибудь сталкивался с чем-то подобным?
И как можно определить тип исключения, которое можно поймать в "catch(...)"?
Привет!
DeaD_MoroZ wrote:
>
> Есть классик CDataBaseEx : public CDatabase.
<skipped>
С CDatabase не работал, поэтому только одно замечание. Поскольку это MFC
класс, то вместо __try — _catch стоит использовать MFC макросы TRY CATCH
Вот пример из исходников самой MFC
TRY
{
CWaitCursor wait;
if (pFile->GetLength() != 0)
Serialize(loadArchive); // load me
loadArchive.Close();
ReleaseFile(pFile, FALSE);
}
CATCH_ALL(e)
{
ReleaseFile(pFile, TRUE);
DeleteContents(); // remove failed contents
TRY
{
ReportSaveLoadException(lpszPathName, e,
FALSE, AFX_IDP_FAILED_TO_OPEN_DOC);
}
END_TRY
DELETE_EXCEPTION(e);
return FALSE;
}
END_CATCH_ALL
Так что можешь оттуда вызвать ReportSaveLoadException, может, она тебе
что-то и расскажет...
--
With best regards,
Pavel Dvorkin
Posted via RSDN NNTP Server 1.7 "Bedlam"
Дело в том что ReportSaveLoadException выдаёт сведения об исключении типа CException и всех его наследниках.
Если бы такое исключение было инициировано, я бы поймал его в "catch(CException*..."
Но это видимо исключение другого типа.. какого — не знаю
Привет!
DeaD_MoroZ wrote:
>
> Дело в том что ReportSaveLoadException выдаёт сведения об исключении типа CException и всех его наследниках.
> Если бы такое исключение было инициировано, я бы поймал его в "catch(CException*..."
>
> Но это видимо исключение другого типа.. какого — не знаю
А если все это под __try — __except поставить и (если оно там поймается)
GetExceptionCode ? Хоть на этом уровне...
--
With best regards,
Pavel Dvorkin
Posted via RSDN NNTP Server 1.7 "Bedlam"