У меня есть приложение C++ с основным потоком и Poco::Timer для запуска обратного вызова, который записывает в файл с помощью Poco::FileOutputStream:
FileOutputStream file("test.txt", ios::binary); <-- *Access violation reading location here*
file.write(reinterpret_cast<char *>(&data), sizeof(data));
file.close();
Код всегда терпел неудачу в первой строке, вот стек вызовов:
testProject.exe!std::ctype::widen(char _Byte=' ') Строка 1716 + 0xf байт С++ testProject.exe!std::basic_ios >::widen(char _Byte=' ') Строка 126 C++ testProject.exe! std::basic_ios >::init(std::basic_streambuf > * _Strbuf=0x038ef700, bool _Isstd=false) Строка 135 + 0xa байт C++ testProject.exe!std::basic_ostream >::basic_ostream >(std::basic_streambuf > * _Strbuf=0x038ef700, bool _Isstd=false) Строка 54 C++ testProject.exe!Poco::FileOutputStream::FileOutputStream(const std::basic_string,std::allocator > & path="c:\Projects\TestProject\test.txt" , int mode=32) Строка 93 + 0xa3 байта C++ testProject.exe!OPC_Server::OnTimer(Poco::Timer & timer={...}) Строка 3656 + 0x13 байт C++ testProject.exe!Poco::TimerCallback:: invoke(Poco::Timer & timer={...}) Строка 212 + 0x14 байт C++ testProject.exe!Poco::Timer::run() Строка 197 + 0x19 байт C++ testProject.exe!Poco::PooledThread:: run() Строка 200 + 0x15 байт C++ testProject.exe!Poco:: `anonymous namespace'::RunnableHolder::run() Строка 57 + 0x17 байт C++ testProject.exe!Poco::ThreadImpl::runnableEntry(void * pThread=0x00db6afc) Строка 207 + 0x20 байт C++ testProject.exe!_callthreadstartex() Строка 348 + 0xf байт C testProject.exe!_threadstartex(void * ptd=0x00db6d00) Строка 331 C
Проследив стек, поток таймера, похоже, проблемно читает инициализацию _Byte в верхней части стека вызовов в внутреннем заголовке xlocale:
_Elem __CLR_OR_THIS_CALL widen(char _Byte) const
{ // widen char
return (do_widen(_Byte)); <-- failed: Access violation reading location
}
Вторая запись в стеке в стандартном заголовке iOS:
_Elem __CLR_OR_THIS_CALL widen(char _Byte) const
{ // convert _Byte to character using imbued locale
const _Ctype& _Ctype_fac = _USE(getloc(), _Ctype);
return (_Ctype_fac.widen(_Byte)); <-- call the top of the stack
}
Третья запись в стеке в стандартном заголовке iOS:
protected:
void __CLR_OR_THIS_CALL init(_Mysb *_Strbuf = 0,
bool _Isstd = false)
{ // initialize with stream buffer pointer
_Init(); // initialize ios_base
_Mystrbuf = _Strbuf;
_Tiestr = 0;
_Fillch = widen(' '); <-- call the second entry
Но очень странно, что тот же самый код работает без ошибок при использовании в основном потоке.
Есть ли какие-либо настройки разрешений, которые мне нужно установить для правильной работы Poco::Timer? Или я упускаю что-то очень очевидное? Спасибо за любую помощь.
РЕДАКТИРОВАНИЕ: ----------------------
Поко версия: 1.7.3
Платформа: окна
_tmain
— это макрос. Этоwmain
, если определеноUNICODE
, иначе этоmain
. Я не понимаю, какое это имеет отношение к вашей проблеме, если только вы каким-то странным образом не получите доступ кargv
. 28.05.2016poco
. Нарушение доступа к файлу предсказуемо, если два потока пытаются одновременно открыть один и тот же файл с неправильным тегом общего доступа. 31.05.2016