Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > C/C++: Системное программирование и WinAPI > как дождаться окончания процесса записи файла?


Автор: antpu238 03.12.16, 20:16
здравствуйте,

в инете написано, что мол написал CreatFile + WriteFile и забудь. ОС сама справится с контролем.
У меня прога собирает данные с АЦП, и иногда непредсказуемо зависает. Опытным путем выяснил, что начинается новый цикл сбора данных, хотя предыдущие еще не записаны. Мало того бывает, что не записаны файлы 2-3 цикла назад!

И все же, есть какой-нибудь способ дождаться пока файл на жесткий диск не запишется?

Спасибо.

Автор: ЫукпШ 03.12.16, 21:18
Цитата antpu238 @
в инете написано, что мол написал CreatFile + WriteFile и забудь. ОС сама справится с контролем.

А "CloseHandle" не пробовал делать ?

Добавлено
Цитата antpu238 @
И все же, есть какой-нибудь способ дождаться пока файл на жесткий диск не запишется?

Можно сделать, как бы, наоборот.
Смастери класс, посредством которого будешь спасать
данные в файл.
Сделаем там буфер.
Для записи испльзуем метод этого класса.
Алгоритм приблизительно такой:
- если буфер ещё не заполнен до конца, последовательно пишем в буфер.
- подсчитываем всё ещё свободное место в буфере.
- как только свободного места больше не останется,
сбрасываем содержимое буфера в файл
- Продолжаем последовательно записывать данные в буфер теперь уже сначала.
итд итп.
Эффективность записи в файл большими порциями получится существенно выше.
---
Процедура, использующая запись в файл, вообще не будет (и не должна) знать,
когда данные будут записываться в файл, а когда - в буфер.

Автор: antpu238 03.12.16, 21:30
ЫукпШ CloseHandle использую сразу же после WriteFile.

Над вторым методом завтра буду думать. Спасибо.

Автор: bobjones 04.12.16, 19:25
FlushFileBuffers

Автор: negram 04.12.16, 19:48
я конечно не особо в виндовом API разбираюсь, но lpNumberOfBytesWritten на выходе совпадает с nNumberOfBytesToWrite?

Автор: Flex Ferrum 05.12.16, 07:20
Сейчас, погоди. Не думаю, что проблема собственно в буферизированной записи (её, к слову, можно решить выставлением флагов FILE_FLAG_NO_BUFFERING и FILE_FLAG_WRITE_THROUGH в CreateFile). Есть у меня сильное подозрение, что читаешь с устройства и пишешь ты в разных потоках. И, вероятнее всего, напортачил с синхронизацией. Расскажи, для начала, как ты снимаешь данные с устройства и передаешь на запись в файл?

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)