одновременное обращение к одному файлу из нескольких потоков
От: MrOduvanchik  
Дата: 31.07.06 06:40
Оценка:
Есть два потока. Один в конец файла всегда пишет, второй поток из этогоже файла всевремя вычитывает, из середины. Можно ли это делать так, чтоб одновременно были открыты файлы из двух потоков, и чтоб один поток не дожидался закрытия другого.

Нашел параметры типа CFile::shareDenyNone, так вот у меня с этими параметрами в дебаг режиме вылетает синий экран.

Заранее всем спасибо.
Re: одновременное обращение к одному файлу из нескольких пот
От: llirik  
Дата: 31.07.06 06:52
Оценка:
Здравствуйте, MrOduvanchik, Вы писали:

MO>Есть два потока. Один в конец файла всегда пишет, второй поток из этогоже файла всевремя вычитывает, из середины. Можно ли это делать так, чтоб одновременно были открыты файлы из двух потоков, и чтоб один поток не дожидался закрытия другого.


MO>Нашел параметры типа CFile::shareDenyNone, так вот у меня с этими параметрами в дебаг режиме вылетает синий экран.


MO>Заранее всем спасибо.


используй maping файлов
CreateFileMapping в одном потоке, OpenFileMapping в другом
создай именованный объект

только если ты заранее не знаешь размер файла, выделяй по максимуму
Мне твоя Москва нравится, и обратно в Россию я не вернусь! (с) мыльная о.
Re: одновременное обращение к одному файлу из нескольких пот
От: llirik  
Дата: 31.07.06 06:53
Оценка:
Здравствуйте, MrOduvanchik, Вы писали:

это ворос к WinAPI
Мне твоя Москва нравится, и обратно в Россию я не вернусь! (с) мыльная о.
Re: одновременное обращение к одному файлу из нескольких пот
От: Testus  
Дата: 31.07.06 07:11
Оценка:
Здравствуйте, MrOduvanchik, Вы писали:

MO>Есть два потока. Один в конец файла всегда пишет, второй поток из этогоже файла всевремя вычитывает, из середины. Можно ли это делать так, чтоб одновременно были открыты файлы из двух потоков, и чтоб один поток не дожидался закрытия другого.

MO>Нашел параметры типа CFile::shareDenyNone, так вот у меня с этими параметрами в дебаг режиме вылетает синий экран.
MO>Заранее всем спасибо.

А не легче ли открыть файл на чтение и запись — передать дискриптор в оба потока и в одном спокойно писать а вдугом читать (правда при таком варианте возможны проблемы с перекрытием данных — когда один еще не дописал и другой уже прочитал от туда), но эта проблема рашаеться симафорами или другими способами синхронизации.
Glück auf
Re: одновременное обращение к одному файлу из нескольких пот
От: andrey.arakcheev http://arakcheev.googlepages.com
Дата: 29.11.06 06:14
Оценка:
Здравствуйте, MrOduvanchik, Вы писали:



MO>Нашел параметры типа CFile::shareDenyNone, так вот у меня с этими параметрами в дебаг режиме вылетает синий экран.


Впиши ти параметры:

CFile::modeReadWrite | CFile::shareDenyWrite


В этом случае можно писать и только читать
Re: одновременное обращение к одному файлу из нескольких пот
От: IvanM Россия  
Дата: 29.11.06 07:47
Оценка:
Здравствуйте, MrOduvanchik, Вы писали:

MO>Есть два потока. Один в конец файла всегда пишет, второй поток из этогоже файла всевремя вычитывает, из середины. Можно ли это делать так, чтоб одновременно были открыты файлы из двух потоков, и чтоб один поток не дожидался закрытия другого.


Можно сделать так.

Читающий поток:
HANDLE hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, ...); // Открываем на чтение

//...

DWORD dwReadPos = 1234;
DWORD dwReadLength = 1234;

SetFilePointer(hFile, dwReadPos, NULL, FILE_BEGIN); // устанавливаем нужную позицию
LockFile(hFile, dwReadPos, 0, dwReadLength, 0); // блокируем нужный регион
ReadFile(hFile, lpBuffer, dwReadLength, ...); // читаем
UnlockFile(hFile, dwReadPos, 0, dwReadLength, 0); // разблокируем

// ...


Пишущий поток:
HANDLE hFile = CreateFile(szFileName, GENERIC_WRITE, FILE_SHARE_READ, ...); // Открываем на запись

//...

DWORD dwWritePos = SetFilePointer(hFile, 0, NULL, FILE_END); // дописываем в конец
DWORD dwWriteLength = 1234;

LockFile(hFile, dwWritePos, 0, dwWriteLength, 0); // можно блокировать за пределами файла, если мы дописываем в конец
WriteFile(hFile, lpBuffer, dwWriteLength, ...); // пишем
UnlockFile(hFile, dwWritePos, 0, dwWriteLength, 0); // разблокируем

// ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.