Russian Qt Forum
Ноябрь 26, 2024, 10:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: ленивая запись в Qt  (Прочитано 3144 раз)
Radmir
Гость
« : Апрель 04, 2014, 20:47 »

Hi, All,

Есть ли в Qt возможность запретить ленивую запись файла?
Точнее: Я скачал асинхронно с интернета и записал файл, и захотел прочесть его, а его нет, хотя сигнал с момента file.close уже был. Понадобилось пропустить несколько тысяч событий из очереди, прежде  чем файл стал доступен (file.exists() вернул true)!

В msvc можно было запретить "ленивую" запись, есть ли что-либо подобное в Qt?

С уважением,
Радмир
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #1 : Апрель 04, 2014, 22:24 »

Не совсем "запретить", но самостоятельно вызывать QFile::flush() может помочь.
Записан
Bepec
Гость
« Ответ #2 : Апрель 04, 2014, 22:32 »

close отлично справляется. По крайней мере в 4.7 и выше. Буквально пару минут назад проверял. Write-Close-Точка остановки - файл уже есть.
Если вы о моментальном чтении из файла? Насколько я помню в Windows ленивая запись. Т.е. сразу же после закрытия вы файл можете получить. А можете нет. Но надо уточнить, ибо я не задавался таким аспектом.

PS хотя вру, всё работает прекрасно. Тот же озвучиватель текста с гугла у меня спокойно пишет файл и сразу воспроизводит.

« Последнее редактирование: Апрель 04, 2014, 22:34 от Bepec » Записан
Radmir
Гость
« Ответ #3 : Апрель 17, 2014, 07:38 »

Не совсем "запретить", но самостоятельно вызывать QFile::flush() может помочь.
close отлично справляется. По крайней мере в 4.7 и выше. Буквально пару минут назад проверял. Write-Close-Точка остановки - файл уже есть.
Если вы о моментальном чтении из файла? Насколько я помню в Windows ленивая запись. Т.е. сразу же после закрытия вы файл можете получить. А можете нет. Но надо уточнить, ибо я не задавался таким аспектом.

PS хотя вру, всё работает прекрасно. Тот же озвучиватель текста с гугла у меня спокойно пишет файл и сразу воспроизводит.


Разница есть, попробуйте сохранять на сетевом диске, и читать другой программой...
Я писал на васике, так все было вроде хорошо, а временами на сетевом диске ничего не появлялось, пришлось вставить модуль на Си, который запретил ленивую запись, и все стало на место...

Вот я и думал, может в Qt можно запретить ленится?...

close/flush сделать не могу, файл грузится с http, все происходит асинхронно и внутри,..

сделал в цикле вызов processevent , цикл прерывается как только файл станет существовать, под ХП понадобилось 2000 повторений, а под Юбунту 13.10 - > 8000, ух!

Есть идеи?

С уважением,
Радмир
Записан
Bepec
Гость
« Ответ #4 : Апрель 17, 2014, 08:09 »

По аналогии с SQL и ленивой загрузкой. Буферизация операций с диском Улыбающийся
Когда файл оправленный на запись попадает в буфер. Соответственно пока система его из буфера не вытащит и не запишет на диск, он будет в "недосягаемости".

to Radmir: Вы сейчас проблемами негров шерифа грузите Веселый Сетевое взаимодействие это уже работа ОС. И в ОС можно отключить или включить нужный вам функционал, хотя могу и ошибаться.
Записан
OKTA
Гость
« Ответ #5 : Апрель 17, 2014, 08:13 »

Да, про лень прочитал, спасибо)
Только не могу понять, почему же flush не помогает для борьбы с ленью?  Шокированный
Записан
Bepec
Гость
« Ответ #6 : Апрель 17, 2014, 08:28 »

Да, мои результаты не могут быть признаны вменяемыми Грустный У меня SSD Веселый

Ну тут от ОС зависит. Насколько я помню в некоторых встраиваемых буферизация независимая в смысле неотключаемая.

А тут не выходит из-за обращения к сетевому диску. Там механизм другой.
Записан
OKTA
Гость
« Ответ #7 : Апрель 17, 2014, 09:26 »

And what about QIODevice::Unbuffered   0x0020   Any buffer in the device is bypassed?
К сожалению, не могу проверить сам)
« Последнее редактирование: Апрель 17, 2014, 09:31 от OKTA » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.108 секунд. Запросов: 23.