Название: Асинхронная запись (добавление) текста в файл Отправлено: 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 - надеюсь все знаете такой файловый менеджер. Так вот - в первых версиях фара было все тоже - выключаешь комп - а запись не закончена. Но в последних версиях эта проблема убрана и без помощи галочки кеширования на диск. Значит как то все же можно? Пусть это будет только для винды. добавлено: Погуглил, оказалось что там всего то в функции 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 |