Название: ленивая запись в Qt Отправлено: Radmir от Апрель 04, 2014, 20:47 Hi, All,
Есть ли в Qt возможность запретить ленивую запись файла? Точнее: Я скачал асинхронно с интернета и записал файл, и захотел прочесть его, а его нет, хотя сигнал с момента file.close уже был. Понадобилось пропустить несколько тысяч событий из очереди, прежде чем файл стал доступен (file.exists() вернул true)! В msvc можно было запретить "ленивую" запись, есть ли что-либо подобное в Qt? С уважением, Радмир Название: Re: ленивая запись в Qt Отправлено: Johnik от Апрель 04, 2014, 22:24 Не совсем "запретить", но самостоятельно вызывать QFile::flush() может помочь.
Название: Re: ленивая запись в Qt Отправлено: Bepec от Апрель 04, 2014, 22:32 close отлично справляется. По крайней мере в 4.7 и выше. Буквально пару минут назад проверял. Write-Close-Точка остановки - файл уже есть.
Если вы о моментальном чтении из файла? Насколько я помню в Windows ленивая запись. Т.е. сразу же после закрытия вы файл можете получить. А можете нет. Но надо уточнить, ибо я не задавался таким аспектом. PS хотя вру, всё работает прекрасно. Тот же озвучиватель текста с гугла у меня спокойно пишет файл и сразу воспроизводит. Название: Re: ленивая запись в Qt Отправлено: Radmir от Апрель 17, 2014, 07:38 Не совсем "запретить", но самостоятельно вызывать QFile::flush() может помочь. close отлично справляется. По крайней мере в 4.7 и выше. Буквально пару минут назад проверял. Write-Close-Точка остановки - файл уже есть. Если вы о моментальном чтении из файла? Насколько я помню в Windows ленивая запись. Т.е. сразу же после закрытия вы файл можете получить. А можете нет. Но надо уточнить, ибо я не задавался таким аспектом. PS хотя вру, всё работает прекрасно. Тот же озвучиватель текста с гугла у меня спокойно пишет файл и сразу воспроизводит. Разница есть, попробуйте сохранять на сетевом диске, и читать другой программой... Я писал на васике, так все было вроде хорошо, а временами на сетевом диске ничего не появлялось, пришлось вставить модуль на Си, который запретил ленивую запись, и все стало на место... Вот я и думал, может в Qt можно запретить ленится?... close/flush сделать не могу, файл грузится с http, все происходит асинхронно и внутри,.. сделал в цикле вызов processevent , цикл прерывается как только файл станет существовать, под ХП понадобилось 2000 повторений, а под Юбунту 13.10 - > 8000, ух! Есть идеи? С уважением, Радмир Название: Re: ленивая запись в Qt Отправлено: Bepec от Апрель 17, 2014, 08:09 По аналогии с SQL и ленивой загрузкой. Буферизация операций с диском :)
Когда файл оправленный на запись попадает в буфер. Соответственно пока система его из буфера не вытащит и не запишет на диск, он будет в "недосягаемости". to Radmir: Вы сейчас проблемами негров шерифа грузите :D Сетевое взаимодействие это уже работа ОС. И в ОС можно отключить или включить нужный вам функционал, хотя могу и ошибаться. Название: Re: ленивая запись в Qt Отправлено: OKTA от Апрель 17, 2014, 08:13 Да, про лень прочитал, спасибо)
Только не могу понять, почему же flush не помогает для борьбы с ленью? :o Название: Re: ленивая запись в Qt Отправлено: Bepec от Апрель 17, 2014, 08:28 Да, мои результаты не могут быть признаны вменяемыми :( У меня SSD :D
Ну тут от ОС зависит. Насколько я помню в некоторых встраиваемых буферизация независимая в смысле неотключаемая. А тут не выходит из-за обращения к сетевому диску. Там механизм другой. Название: Re: ленивая запись в Qt Отправлено: OKTA от Апрель 17, 2014, 09:26 And what about QIODevice::Unbuffered 0x0020 Any buffer in the device is bypassed?
К сожалению, не могу проверить сам) |