Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.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). Есть у меня сильное подозрение, что читаешь с устройства и пишешь ты в разных потоках. И, вероятнее всего, напортачил с синхронизацией. Расскажи, для начала, как ты снимаешь данные с устройства и передаешь на запись в файл? |