Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Искажение данных при хранении в разделяемой памяти

15K
24 июля 2007 года
nevi
35 / / 13.05.2007
Всем привет. Я не знаю кого винить в такой ситуации - компилятор или ОС: Создается в приложении разделяемая память через CreateFileMapping и подключается через MapViewOfFile. Другой процесс открывает память и читает то, что записало первое приложение. Проблема в том , что в один прекрасный момент вместо цифры 1 или 2 читается например 14563905764, причем никаких манипуляций сами приложения не производят. Как можно разрешить ситуацию???? может в память что-то гадит (как тогда защитить) или какие-то настройки компилятора?
Просто передаваемое значение описывается типом enum{}; и когда я после глюка перенумеровал значения в ручную, т.е. enum{A = 0, B = 1....}; то глюк исчез, а потом снова появился, причем ничего не менялось :(

З.Ы. код приводить не вижу смысла, так как производимые операции стандартные.
255
25 июля 2007 года
Dart Bobr
1.4K / / 09.04.2004
Может ты вылез за пределы своего меппинга.. Приведи кусочек кода..
15K
25 июля 2007 года
nevi
35 / / 13.05.2007
ок. Вот так создаю память (массив структур типа ActionRec):
int fa_Interface::CreateInterface(int inBrokerCount, int inInstrCount)
{
char* pBuf;//буферный указатель
TableLen = inBrokerCount * inInstrCount;//длина таблиц (всегда > 0)

...

hActionTable = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, TableLen * sizeof(ActionRec), NAME_ACTION_TABLE);
pBuf = NULL;
pBuf = (char*)MapViewOfFile(hActionTable, FILE_MAP_WRITE, 0, 0, 0);
pActionTable = (ActionRec*)pBuf;
if(!pActionTable)
{
MessageBox(NULL, "Ошибка! Не могу создать pActionTable", "Монитор", MB_OK);
//ОБРАБОТАТЬ ОШИБКУ!
return 5;
}

...
}
вот так пишу в элемент массива:
int fa_Interface::AddActionRec(ActionRec* inActionRec)
{
if(!Active) return 12;//ОБРАБОТАТЬ ОШИБКУ!

//корректируем необходимые элементы структуры ActionRec
inActionRec->BrokerName[NAMELEN - 1] = '\0';
inActionRec->InstrName[NAMELEN - 1] = '\0';
inActionRec->Active = 1;
//ищем свободную ячейку в массиве
int i;
WaitForSingleObject(hPriceActionSem, INFINITE); //---блок. память
for(i = 0; i < TableLen; i++)
if(pActionTable.Active == 0)
{
pActionTable = *inActionRec;
ReleaseMutex(hPriceActionSem); //---разблок. память
return 0;
}
MessageBox(NULL, "ERROR! таблица ACTION переполнена", "", MB_OK);//ОБРАБОТАТЬ ОШИБКУ!
ReleaseMutex(hPriceActionSem); //---разблок. память
return 14;
}

Так открываю память другим процессом:
int fa_Interface::OpenInterface(void)
{
...

char* pBuf;
pBuf = NULL;
hActionTable = OpenFileMapping(FILE_MAP_WRITE, FALSE, NAME_ACTION_TABLE);
pBuf = (char*)MapViewOfFile(hActionTable, FILE_MAP_WRITE, 0, 0, 0);
pActionTable = (ActionRec*)pBuf;
if((!pActionTable) || (!hActionTable))
{
MessageBox(NULL, "Ошибка! Не могу создать таблицу pActionTable.", "Арбитр", MB_OK);
//ОБРАБОТАТЬ ОШИБКУ!
return 10;
}

...
}

И вот так считываю запись:
int fa_Interface::LoadActionRec(char* inBrokerName, char* inInstrName, int inIndex, ActionRec* inActionRec)
{
WaitForSingleObject(hPriceActionSem, INFINITE); //---блок. память
//вариант поиска по заданным именам брокера и инструмента
int i;
int j = 0;
int inLen1 = strlen(inInstrName);
int inLen2 = strlen(inBrokerName);
bool ft_flag1, ft_flag2;
//вычисляем запись с совпадающими именами брокера и инструмента
for(i = 0; i < TableLen; i++)
{
//ищем среди "активных" записей
if(pActionTable.Active == 0) continue;

//сравнение строк
ft_flag1 = true; j = 0;
while((j < (NAMELEN - 1)) && (j < inLen1))
{
if(inInstrName[j] != pActionTable.InstrName[j])
{
ft_flag1 = false;
break;
}
j++;
}
if(!ft_flag1) continue;

//сравнение строк
ft_flag2 = true; j = 0;
while((j < (NAMELEN - 1)) && (j < inLen2))
{
if(inBrokerName[j] != pActionTable.BrokerName[j])
{
ft_flag2 = false;
break;
}
j++;
}
if(!ft_flag2) continue;
//если есть оба совпадения - возвращаем найденную запись
*inActionRec = pActionTable;
//очистить запись
pActionTable.Active = 0;

ReleaseMutex(hPriceActionSem); //---разблок. память
return 0;
}
ReleaseMutex(hPriceActionSem); //---разблок. память

return 17;//ОБРАБОТАТЬ ОШИБКУ! (NO_RESULT_FOUNDED)
}

вот и все. причем ошибка возникает не всегда, но эээ.. тенденциозно код уже прочесал на 1000 раз, посто мистика какая-то :(
15K
25 июля 2007 года
nevi
35 / / 13.05.2007
структура ActionRec:
struct ActionRec
{
char BrokerName[NAMELEN];
char InstrName[NAMELEN];

InstrActionEnum InstrAct;
double Lot;
long Magik;

int Active;
};


глючит именно поле "InstrAct" :(
вот ее тип:
enum InstrActionEnum{IA_WAIT = 0, IA_BUY = 1, IA_SELL = 2, IA_CLOSE = 3, IA_DEINIT = 4};
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог