On-line: SergKis, гостей 2. Всего: 3 [подробнее..]
АвторСообщение





Пост N: 681
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 11.11.22 14:07. Заголовок: FOPEN() -> FWRITE() -> FCLOSE()


Добрый день

Есть у меня стандартный алгоритм, который открывает файл на запись и кусочками через FWRITE() с красивым прогресс-баром записывает его, после чего закрывает.

Столкнулся с тем, что при записи на USB флэшки и/или некоторые ресурсы с медленным доступом прогресс почти мгновенно добегает до 100%, после чего доооолго висит на отработке команды FCLOSE().

Понятное дело, что это кэш Windows. Как-бы пофиксить такое поведение ? То есть нужна какая-то команда после FWRITE(), (по аналогии с базой данных - DBCOMMIT()) которая дожидалась бы окончания процесса физической записи на носитель, после чего брался-бы следующий кусок и тд.

Спасибо: 0 
ПрофильЦитата Ответить
Новых ответов нет [см. все]


администратор




Пост N: 7720
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 11.11.22 16:19. Заголовок: Попробуй вместо FOPE..


Попробуй вместо FOPEN() -> FWRITE() -> FCLOSE()
HB_VFOPEN() -> HB_VFWRITE() -> HB_VFCLOSE()
Возможно результат будет иным.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4177
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 11.11.22 16:51. Заголовок: Делаю добавку к max ..


Делаю добавку к max счетчику ~ 1/3 - 1/5 от значения для индикации, т.е. не довожу до конца бегунка весь процесс копирования (один файл или несколько их или расчета по алгоритмам) и потом, выйдя из цикла (можно подержать паузу тут из ini), довожу бегунок до конца с интервалом от 0.1 - 0.7 сек. (по умолчанию 0.5). Потом вывожу текст о завершении или статистика и подвешиваю ~3-5 сек.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7721
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 11.11.22 17:03. Заголовок: Sergy пишет: с кра..


Sergy пишет:

 цитата:
с красивым прогресс-баром


Покажи картинку

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 4094
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 11.11.22 18:28. Заголовок: Наблюдал подобное пр..


Наблюдал подобное при копировании файлов фаром на флешку. У него свой прогресс-бар. Может быть такой эффект дает антивирус

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7722
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 11.11.22 18:40. Заголовок: Pasha пишет: Наблюд..


Pasha пишет:

 цитата:
Наблюдал подобное при копировании файлов фаром на флешку


Тоже происходит и при копировании файлов на USB винт.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4178
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 11.11.22 19:58. Заголовок: SergKis пишет Делаю ..


SergKis пишет
 цитата:
Делаю добавку к max счетчику ~ ...


Другой вариант для бегунка исп. таймер (при достижении max, начинать с начала счетчик бегунка, если надо). В функцию такого бегунка передаю блок кода, счетчик max, шаг и заголовок окна. Ф-я не большая (МиниГуи), как есть, чисто для инфы Скрытый текст


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 682
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 12.11.22 14:00. Заголовок: Dima пишет: Покажи ..


Dima пишет:

 цитата:
Покажи картинку



Вот так работает у меня hb_ZipFile():



Тут два прогресса: общий, по всем файлам плюс внутри каждого файла.

А вот при копировании архива на съемный носитель получается сразу 100% и потом FCLOSE(). Пойду почитаю про hb_vfFWrite(). Потому как шаманства со счетчиком не очень идея, тк сложно угадать реальное время записи - на флэшке одна скорость, на удаленном бэкап сервере под своей нативной ОС (там что-то типа TrueNAS OS) - своя скорость. При копировании даже внутри локальной сети - третья скорость... Плюс целый зоопарк машин с разной производительностью, плюс разная загрузка сети в зависимости от числа активных юзеров...

Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 683
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 12.11.22 14:06. Заголовок: Pasha пишет: Наблюд..


Pasha пишет:

 цитата:
Наблюдал подобное при копировании файлов фаром на флешку. У него свой прогресс-бар. Может быть такой эффект дает антивирус


Вот как раз Far копирует так, как нужно, прогресс движется достаточно равномерно и при достижении 100% копирование полностью завершено: если тут-же нажать на иконку "безопасного извлечения" - все ок.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 4179
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 12.11.22 15:29. Заголовок: Sergy пишет Пойду по..


Sergy пишет
 цитата:
Пойду почитаю про hb_vfFWrite()


Если поможет, хорошо, и если в ней есть упр. буф. windows

 цитата:
Потому как шаманства со счетчиком не очень идея, тк сложно угадать реальное время записи


Если сохранить (при первом копировании или при каждом) для файла[ов] время записи (для устройства от fOpen() до fClose()) в ini (раб. месте) для конкретной PC, то потом можно ставить (с коэффициентом) это время, например в схему выше по таймеру и уже, думаю, будешь попадать в "струю" как надо.
PS
hbedit редактор имеет файл открытий файлов с запоминанием CDP и ..., ставлю у себя в ini 1500 строк для этого журнала работает как часы
PS2
Переписав на устройство, например, тестовый файл (в скрытом режиме) и удалив его потом, можно опр условную единицу для расчета счетчика и шага и исп. это значение исходя из длины файлов + коэффициент увеличения, сохранить это значение и исп. его для работы с этим устройством. Тоже вариант "бегунка" по таймеру

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 684
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 12.11.22 16:49. Заголовок: Итак Связка hb_vfOp..


Итак

Связка hb_vfOpen() -> hb_vfWrite() -> hb_vfClose() ЗАРАБОТАЛА в нужном ключе. Потому что есть волшебный hb_vfCommit()

Единственное, что пришлось повозиться с hb_vfOpen(), тк при использовании его вместо FCREATE() нужно указывать атрибуты FO_CREAT+FO_TRUNC+FO_WRITE. Я сначала поставил только первый, получил os error - 5 - Access denied и созданный выходной файл нулевого размера. Часа полтора прыгал, не мог понять, где косяк - как так - файл создать можно, а записать в него нельзя.

И нужно поиграть размером буфера. Был у меня по умолчанию 16Кб, он сильно замедляет процесс. Поставил размером 5% от MEMORY( HB_MEM_BLOCK ) - получился 100 мегабайт буфер, прогресс на медленных носителях выходит "рывками". Остановился на подходящем - 512Kb. С ним все норм.

Спасибо за помощь, друзья.

PS: вирусы шифровальщики - зло. Делайте бэкапы регулярно пожалуйста.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 4095
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 13.11.22 10:29. Заголовок: Sergy пишет: Потому..


Sergy пишет:

 цитата:
Потому что есть волшебный hb_vfCommit()



Оказывается, есть и hb_FCommit, который можно использовать с FOpen/FWrite

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 685
Зарегистрирован: 08.07.06
ссылка на сообщение  Отправлено: 13.11.22 12:35. Заголовок: Pasha пишет: Оказыв..


Pasha пишет:

 цитата:
Оказывается, есть и hb_FCommit, который можно использовать с FOpen/FWrite


Ваще крутяк

Посмотрел, как он реализован:

HB_FUNC( HB_FCOMMIT ) 
{
HB_ERRCODE uiError = 6;

if( HB_ISNUM( 1 ) )
{
hb_fsCommit( hb_numToHandle( hb_parnint( 1 ) ) );
uiError = hb_fsError();
}

hb_fsSetFError( uiError );
}



Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 632
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет