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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Асинхронная запись (добавление) текста в файл  (Прочитано 11621 раз)
CJ1
Гость
« : Июнь 03, 2012, 06:05 »

Как в Qt асинхронно добавлять записи в текстовый файл?
Записан
CJ1
Гость
« Ответ #1 : Июнь 03, 2012, 09:00 »

Разобрался, а вот как создать файл если его нет?
Записан
Serr500
Гость
« Ответ #2 : Июнь 03, 2012, 10:21 »

QFile::open(QIODevice::ReadWrite)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Июнь 03, 2012, 10:39 »

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

Асинхронно - значит управление возвращается приложению без ожидания конца записи. О таких ф-циях в Qt мне ничего не известно. Если Вы имели ввиду "добавить строку в любой момент" - то это все равно синхронная запись  Улыбающийся

Хотелось бы в данном моменте вот что уточнить - по моему запись в фаил в винде идет асинхронно по определению. Вернее сама винда так делает. Пробовал такой пример - пишем в фаил очень много строк. Ждем пока запишется - ок. Записалось - управление передалось программе. Теперь выдергиваем комп из сети - снова включаем и видим, что в файле содержится только часть строк, а не все. Т.е. физически строки в фаил на винт не записались еще в тот момент. когда управление перешло к программе.
Вопрос - кто в этом виноват? Улыбающийся
Записан
V1KT0P
Гость
« Ответ #5 : Июнь 05, 2012, 17:18 »

Вопрос - кто в этом виноват? Улыбающийся
Виновата установленная галочка "Разрешить кэширование записи на диск" на вкладке "Политика" в свойствах жесткого диска. =) Отключение этого пункта может серьезно замедлить работу с диском.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июнь 05, 2012, 17:45 »

Хотелось бы в данном моменте вот что уточнить - по моему запись в фаил в винде идет асинхронно по определению. Вернее сама винда так делает.
То же самое и в др OC - и уже десятки лет. Более того, flush и даже закрытие файла не гарантируют физической записи на диск. Можно пояснить так: после выполнения синхронной записи (когда управление вернулось приложению) размер файла будет с учетом записанного и приложение может прочитать записанное. Для асинхронной записи это неверно. А уж как там ОС кеширует - его личное дело. В Mac всегда были 2 варианта ф-ций, напр PBWriteSync/PBWriteAsync. так же и для чтения
Записан
Alex_C
Гость
« Ответ #7 : Июнь 05, 2012, 22:10 »

Мммм ребят, не все так просто. Все что вы написали - я конечно знаю. Но есть Far - надеюсь все знаете такой файловый менеджер. Так вот - в первых версиях фара было все тоже - выключаешь комп - а запись не закончена. Но в последних версиях эта проблема убрана и без помощи галочки кеширования на диск. Значит как то все же можно? Пусть это будет только для винды.
Записан
V1KT0P
Гость
« Ответ #8 : Июнь 05, 2012, 22:20 »

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

добавлено:
Погуглил, оказалось что там всего то в функции CreateFile() установить в параметре dwFlagsAndAttributes FILE_FLAG_WRITE_THROUGH и/или FILE_FLAG_NO_BUFFERING.
« Последнее редактирование: Июнь 05, 2012, 22:25 от V1KT0P » Записан
Serr500
Гость
« Ответ #9 : Июнь 06, 2012, 08:19 »

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

С флагом FILE_FLAG_NO_BUFFERING всё очень непросто. При его использовании надо учитывать геометрию диска. Вполне достаточно FILE_FLAG_WRITE_THROUGH.
There are strict requirements for successfully working with files opened with CreateFile using the FILE_FLAG_NO_BUFFERING flag
Записан
CJ1
Гость
« Ответ #10 : Июнь 06, 2012, 08:31 »

Да с FILE_FLAG_NO_BUFFERING все элементарно просто.
Просто нужно ставить количество записываемых байт кратно размеру кластера кластера диска на который ты пишешь, на WinAPI я так часто делаю, и скорость записи огромных файлов на много выше чем через буфер винды, и данные гарантом сохраняются.

А по поводу моего вопроса, то я все облазил, и вообщем понял что никак средствами Qt это не организовать, да и ладно, сделал уже по другому, без проблем.
Записан
Serr500
Гость
« Ответ #11 : Июнь 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
Записан
CJ1
Гость
« Ответ #12 : Июнь 06, 2012, 08:53 »

Ну это из того и вытикает, я использую VirtualAlloc для этого, она выделяет память уже выровненную
Записан
DmitryM
Гость
« Ответ #13 : Июнь 06, 2012, 10:08 »

Асинхронно - значит управление возвращается приложению без ожидания конца записи. О таких ф-циях в Qt мне ничего не известно. Если Вы имели ввиду "добавить строку в любой момент" - то это все равно синхронная запись  Улыбающийся
Можно писать в буфер, а буфер скидывать в файл по событию таймера.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Июнь 06, 2012, 13:40 »

Да с FILE_FLAG_NO_BUFFERING все элементарно просто.
А по поводу моего вопроса, то я все облазил, и вообщем понял что никак средствами Qt это не организовать,
Интересно а как Вы собирались поймать окончание асинхронной записи? Или "сказано записать, а там хоть трава не расти"  Улыбающийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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