Russian Qt Forum

Qt => Вопросы новичков => Тема начата: CJ1 от Июнь 03, 2012, 06:05



Название: Асинхронная запись (добавление) текста в файл
Отправлено: CJ1 от Июнь 03, 2012, 06:05
Как в Qt асинхронно добавлять записи в текстовый файл?


Название: Re: Асинхронная запись (добавление) текста в файл
Отправлено: CJ1 от Июнь 03, 2012, 09:00
Разобрался, а вот как создать файл если его нет?


Название: Re: Асинхронная запись (добавление) текста в файл
Отправлено: Serr500 от Июнь 03, 2012, 10:21
QFile::open(QIODevice::ReadWrite)


Название: Re: Асинхронная запись (добавление) текста в файл
Отправлено: Igors от Июнь 03, 2012, 10:39
Асинхронно - значит управление возвращается приложению без ожидания конца записи. О таких ф-циях в Qt мне ничего не известно. Если Вы имели ввиду "добавить строку в любой момент" - то это все равно синхронная запись  :)


Название: Re: Асинхронная запись (добавление) текста в файл
Отправлено: Alex_C от Июнь 05, 2012, 17:11
Асинхронно - значит управление возвращается приложению без ожидания конца записи. О таких ф-циях в Qt мне ничего не известно. Если Вы имели ввиду "добавить строку в любой момент" - то это все равно синхронная запись  :)

Хотелось бы в данном моменте вот что уточнить - по моему запись в фаил в винде идет асинхронно по определению. Вернее сама винда так делает. Пробовал такой пример - пишем в фаил очень много строк. Ждем пока запишется - ок. Записалось - управление передалось программе. Теперь выдергиваем комп из сети - снова включаем и видим, что в файле содержится только часть строк, а не все. Т.е. физически строки в фаил на винт не записались еще в тот момент. когда управление перешло к программе.
Вопрос - кто в этом виноват? :)


Название: Re: Асинхронная запись (добавление) текста в файл
Отправлено: V1KT0P от Июнь 05, 2012, 17:18
Вопрос - кто в этом виноват? :)
Виновата установленная галочка "Разрешить кэширование записи на диск" на вкладке "Политика" в свойствах жесткого диска. =) Отключение этого пункта может серьезно замедлить работу с диском.


Название: Re: Асинхронная запись (добавление) текста в файл
Отправлено: Igors от Июнь 05, 2012, 17:45
Хотелось бы в данном моменте вот что уточнить - по моему запись в фаил в винде идет асинхронно по определению. Вернее сама винда так делает.
То же самое и в др OC - и уже десятки лет. Более того, flush и даже закрытие файла не гарантируют физической записи на диск. Можно пояснить так: после выполнения синхронной записи (когда управление вернулось приложению) размер файла будет с учетом записанного и приложение может прочитать записанное. Для асинхронной записи это неверно. А уж как там ОС кеширует - его личное дело. В Mac всегда были 2 варианта ф-ций, напр PBWriteSync/PBWriteAsync. так же и для чтения


Название: Re: Асинхронная запись (добавление) текста в файл
Отправлено: Alex_C от Июнь 05, 2012, 22:10
Мммм ребят, не все так просто. Все что вы написали - я конечно знаю. Но есть Far - надеюсь все знаете такой файловый менеджер. Так вот - в первых версиях фара было все тоже - выключаешь комп - а запись не закончена. Но в последних версиях эта проблема убрана и без помощи галочки кеширования на диск. Значит как то все же можно? Пусть это будет только для винды.


Название: Re: Асинхронная запись (добавление) текста в файл
Отправлено: V1KT0P от Июнь 05, 2012, 22:20
Мммм ребят, не все так просто. Все что вы написали - я конечно знаю. Но есть Far - надеюсь все знаете такой файловый менеджер. Так вот - в первых версиях фара было все тоже - выключаешь комп - а запись не закончена. Но в последних версиях эта проблема убрана и без помощи галочки кеширования на диск. Значит как то все же можно? Пусть это будет только для винды.
Если через специальные WinApi функции это сделано, то просто сравни импортируемые функции старого и нового Фара, либо проще спросить напрямую автора Фара =).

добавлено:
Погуглил, оказалось что там всего то в функции CreateFile() установить в параметре dwFlagsAndAttributes FILE_FLAG_WRITE_THROUGH и/или FILE_FLAG_NO_BUFFERING.


Название: Re: Асинхронная запись (добавление) текста в файл
Отправлено: Serr500 от Июнь 06, 2012, 08:19
Погуглил, оказалось что там всего то в функции CreateFile() установить в параметре dwFlagsAndAttributes FILE_FLAG_WRITE_THROUGH и/или FILE_FLAG_NO_BUFFERING.

С флагом FILE_FLAG_NO_BUFFERING всё очень непросто. При его использовании надо учитывать геометрию диска. Вполне достаточно FILE_FLAG_WRITE_THROUGH.
Цитата: MSDN http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx
There are strict requirements for successfully working with files opened with CreateFile using the FILE_FLAG_NO_BUFFERING flag


Название: Re: Асинхронная запись (добавление) текста в файл
Отправлено: CJ1 от Июнь 06, 2012, 08:31
Да с FILE_FLAG_NO_BUFFERING все элементарно просто.
Просто нужно ставить количество записываемых байт кратно размеру кластера кластера диска на который ты пишешь, на WinAPI я так часто делаю, и скорость записи огромных файлов на много выше чем через буфер винды, и данные гарантом сохраняются.

А по поводу моего вопроса, то я все облазил, и вообщем понял что никак средствами Qt это не организовать, да и ладно, сделал уже по другому, без проблем.


Название: Re: Асинхронная запись (добавление) текста в файл
Отправлено: Serr500 от Июнь 06, 2012, 08:41
Просто нужно ставить количество записываемых байт кратно размеру кластера кластера диска на который ты пишешь
Не просто. Ещё память нужно выравнивать.
Цитата: MSDN
File access buffer addresses for read and write operations should be physical sector-aligned, which means aligned on addresses in memory that are integer multiples of the volume's physical sector size. Depending on the disk, this requirement may not be enforced.

http://msdn.microsoft.com/en-us/library/windows/desktop/cc644950%28v=vs.85%29.aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/cc644950%28v=vs.85%29.aspx)


Название: Re: Асинхронная запись (добавление) текста в файл
Отправлено: CJ1 от Июнь 06, 2012, 08:53
Ну это из того и вытикает, я использую VirtualAlloc для этого, она выделяет память уже выровненную


Название: Re: Асинхронная запись (добавление) текста в файл
Отправлено: DmitryM от Июнь 06, 2012, 10:08
Асинхронно - значит управление возвращается приложению без ожидания конца записи. О таких ф-циях в Qt мне ничего не известно. Если Вы имели ввиду "добавить строку в любой момент" - то это все равно синхронная запись  :)
Можно писать в буфер, а буфер скидывать в файл по событию таймера.


Название: Re: Асинхронная запись (добавление) текста в файл
Отправлено: Igors от Июнь 06, 2012, 13:40
Да с FILE_FLAG_NO_BUFFERING все элементарно просто.
А по поводу моего вопроса, то я все облазил, и вообщем понял что никак средствами Qt это не организовать,
Интересно а как Вы собирались поймать окончание асинхронной записи? Или "сказано записать, а там хоть трава не расти"  :)


Название: Re: Асинхронная запись (добавление) текста в файл
Отправлено: Serr500 от Июнь 06, 2012, 15:18
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365748%28v=vs.85%29.aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/aa365748%28v=vs.85%29.aspx)
Параметр lpCompletionRoutine.


Название: Re: Асинхронная запись (добавление) текста в файл
Отправлено: Igors от Июнь 06, 2012, 15:34
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365748%28v=vs.85%29.aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/aa365748%28v=vs.85%29.aspx)
Параметр lpCompletionRoutine.
Ну что Вы много ссылок знаете - я ж не спорю :) Но, возможно, было бы лучше если бы простыми словами пояснили как и в какой момент эта ф-ция вызывается. А то товарищи уверенно путают асинхронку с кешированием


Название: Re: Асинхронная запись (добавление) текста в файл
Отправлено: Serr500 от Июнь 06, 2012, 15:44
При включенном кэшировании CompletionRoutine вызовется после помещения всего буфера в кэш, при выключенном - после полной записи на диск. Точнее, после попадания всего буфера в кэш диска или RAID-контроллера, а вовсе не на магнитные пластины диска, как многие думают.

Кэширование. Метод записывает данные в системный дисковый кэш и когда операция завершится, возвращает управление. Иногда встречается мнение, что время записи в кэш очень мало и сравнимо со временем копирования буфера между различными областями памяти. Однако, это не так. Кэш может быть заполнен и менеджер буфера приостановит метод до тех пор, пока он не сбросит на диск незаписанные области и тем самым не освободит достаточно места в кэше.

Асинхронность. Метод помещает запрос на запись в очередь и немедленно возвращает управление. Выполняется почти мгновенно. Менеджер затем извлекает задание из очереди и копирует данные в кэш или на диск. После завершения копирования вызывает CompletionRoutine.


Название: Re: Асинхронная запись (добавление) текста в файл
Отправлено: Igors от Июнь 06, 2012, 17:12
Ну вот, это др дело. Спасибо за разъяснения


Название: Re: Асинхронная запись (добавление) текста в файл
Отправлено: Alex_C от Июнь 07, 2012, 21:44
Спасибо большое за информацию. Теперь бы как бы все это к Qt привязать, да еще на кроссплатформенность перевести ))) Хотя бы с Линукс. Потому как есть весьма экстремальная задача - есть некое устройство под управлением винды или линукса. Питание - не устойчивое - нет упс и т.п. Нужно по максимальности обеспечить сохранность принимаемой записываемой информации на диск. Т.е. устройство когда снова заработает должно перезапросить не записанный на диск кусок. Т.е. как раз о чем разговор.


Название: Re: Асинхронная запись (добавление) текста в файл
Отправлено: DmitryM от Июнь 07, 2012, 22:08
Спасибо большое за информацию. Теперь бы как бы все это к Qt привязать, да еще на кроссплатформенность перевести )))
Для POSIX систем есть aio.h.
Сделать обертку над WinApi и POSIX.


Название: Re: Асинхронная запись (добавление) текста в файл
Отправлено: CJ1 от Июнь 08, 2012, 07:18
Цитировать
Ну что Вы много ссылок знаете - я ж не спорю  Но, возможно, было бы лучше если бы простыми словами пояснили как и в какой момент эта ф-ция вызывается. А то товарищи уверенно путают асинхронку с кешированием

Да никто ничего не путает, это просто кто то затронул вопрос про кэширования, вот и понеслось, читайте все сообщения внимательно!

Я уже давно решил свой вопрос если что, еще после первого ответа мне...


Название: Re: Асинхронная запись (добавление) текста в файл
Отправлено: Alex_C от Июнь 08, 2012, 20:00
Я уже давно решил свой вопрос если что, еще после первого ответа мне...

Да кроме Вашего вопроса, есть еще и просто интерес )) Да и поделиться информацией))


Название: Re: Асинхронная запись (добавление) текста в файл
Отправлено: CJ1 от Июнь 10, 2012, 09:51
Цитировать
Да кроме Вашего вопроса, есть еще и просто интерес )) Да и поделиться информацией))

Понятно, а я думал, это все мне пытаются чтото объяснить )) :D :D :D