Ситуация такая: в приложении необходимо вести журнал протоколов (логи).
Но беда в том, что одновременно может быть запущено несколько экземпляров приложения.
Протоколирование ведётся с использованием класса CFile.
Каждый процесс сначала открывает файл c флажками CFile::modeNoTruncate | CFile::modeReadWrite | CFile::shareDenyNone.
При записи происходит переход в конец файла с помощью функции SeekToEnd() и потом уже осуществляется запись.
Синхронизацию сделал на основе именованного мьютекса. Никто записывать одновременно не может.
Проблема заключается в том, что после того, как в файл что-нибудь записал первый процесс, а потом второй,
то при записи в файл опять первым процессом затирается то, что записал второй, т.е. SeekToEnd() как-бы не срабатывает.
Вызов функции Flush() после записи не помогает.
Подскажите пожалуйста, если кто знает как это исправить.
Здравствуйте, DeaD MoroZ, Вы писали:
DM>Ситуация такая: в приложении необходимо вести журнал протоколов (логи). DM>Но беда в том, что одновременно может быть запущено несколько экземпляров приложения.
...
DM>Подскажите пожалуйста, если кто знает как это исправить.
ИМХО вы пытаетесь найти корректное решение для некорректной задачи. Разные экземпляры даже одного приложения — уже разные приложения. У каждого из них должен быть свой лог. А если куча приложений пишет в один лог, там наверняка будет такой салат, что ценность лога приближается к нулю.
Здравствуйте, Chervinsky, Вы писали:
C> ИМХО вы пытаетесь найти корректное решение для некорректной задачи. Разные экземпляры даже одного приложения — уже разные приложения. У каждого из них должен быть свой лог. А если куча приложений пишет в один лог, там наверняка будет такой салат, что ценность лога приближается к нулю.
C>Сашко.
На самом деле есть несколько приложений, который используют одну DLL'ку. DLL'ка как раз и ведёт лог.
Я не считаю что там будет салат, если реализовать корректную запись. Нечто подобное у меня уже реализовано — просто я столкнулся с проблемой, решив которую всё будет супер.
DM>Ситуация такая: в приложении необходимо вести журнал протоколов (логи). DM>Но беда в том, что одновременно может быть запущено несколько экземпляров приложения.
DM>Протоколирование ведётся с использованием класса CFile. DM>Каждый процесс сначала открывает файл c флажками CFile::modeNoTruncate | CFile::modeReadWrite | CFile::shareDenyNone.
DM>При записи происходит переход в конец файла с помощью функции SeekToEnd() и потом уже осуществляется запись. DM>Синхронизацию сделал на основе именованного мьютекса. Никто записывать одновременно не может.
DM>Проблема заключается в том, что после того, как в файл что-нибудь записал первый процесс, а потом второй, DM>то при записи в файл опять первым процессом затирается то, что записал второй, т.е. SeekToEnd() как-бы не срабатывает.
DM>Вызов функции Flush() после записи не помогает.
Flush — Flushes any data yet to be written.
т.е. при этом не происходит обновление информации о файле, которая хранится в CFile
DM>Подскажите пожалуйста, если кто знает как это исправить.
каждый раз открывать/закрывать файл. Как показывает практика, на скорости это не сильно отражается.
DM>Я не считаю что там будет салат, если реализовать корректную запись. Нечто подобное у меня уже реализовано — просто я столкнулся с проблемой, решив которую всё будет супер.
Ну дык блокируй файл на запись и/или разруливай мьютексами доступ к телу.
Здравствуйте, migel, Вы писали:
M>Ну дык блокируй файл на запись и/или разруливай мьютексами доступ к телу.
Блин.. да проблема не в этом. Доступ я разграничил и никто одновременно не пишет в файл.
Цитирую кусок из описания проблемы:
Проблема заключается в том, что после того, как в файл что-нибудь записал первый процесс, а потом второй,
то при записи в файл опять первым процессом затирается то, что записал второй, т.е. SeekToEnd() как-бы не срабатывает.
Здравствуйте, DeaD MoroZ, Вы писали: DM>Цитирую кусок из описания проблемы: DM>Проблема заключается в том, что после того, как в файл что-нибудь записал первый процесс, а потом второй, DM>то при записи в файл опять первым процессом затирается то, что записал второй, т.е. SeekToEnd() как-бы не срабатывает