Russian Qt Forum
Ноябрь 23, 2024, 22:48
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Вопросы новичков
>
Асинхронная запись (добавление) текста в файл
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Асинхронная запись (добавление) текста в файл (Прочитано 11626 раз)
CJ1
Гость
Асинхронная запись (добавление) текста в файл
«
:
Июнь 03, 2012, 06:05 »
Как в Qt асинхронно добавлять записи в текстовый файл?
Записан
CJ1
Гость
Re: Асинхронная запись (добавление) текста в файл
«
Ответ #1 :
Июнь 03, 2012, 09:00 »
Разобрался, а вот как создать файл если его нет?
Записан
Serr500
Гость
Re: Асинхронная запись (добавление) текста в файл
«
Ответ #2 :
Июнь 03, 2012, 10:21 »
QFile::open(QIODevice::ReadWrite)
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Асинхронная запись (добавление) текста в файл
«
Ответ #3 :
Июнь 03, 2012, 10:39 »
Асинхронно - значит управление возвращается приложению без ожидания конца записи. О таких ф-циях в Qt мне ничего не известно. Если Вы имели ввиду "добавить строку в любой момент" - то это все равно синхронная запись
Записан
Alex_C
Гость
Re: Асинхронная запись (добавление) текста в файл
«
Ответ #4 :
Июнь 05, 2012, 17:11 »
Цитата: Igors от Июнь 03, 2012, 10:39
Асинхронно - значит управление возвращается приложению без ожидания конца записи. О таких ф-циях в Qt мне ничего не известно. Если Вы имели ввиду "добавить строку в любой момент" - то это все равно синхронная запись
Хотелось бы в данном моменте вот что уточнить - по моему запись в фаил в винде идет асинхронно по определению. Вернее сама винда так делает. Пробовал такой пример - пишем в фаил очень много строк. Ждем пока запишется - ок. Записалось - управление передалось программе. Теперь выдергиваем комп из сети - снова включаем и видим, что в файле содержится только часть строк, а не все. Т.е. физически строки в фаил на винт не записались еще в тот момент. когда управление перешло к программе.
Вопрос - кто в этом виноват?
Записан
V1KT0P
Гость
Re: Асинхронная запись (добавление) текста в файл
«
Ответ #5 :
Июнь 05, 2012, 17:18 »
Цитата: Alex_C от Июнь 05, 2012, 17:11
Вопрос - кто в этом виноват?
Виновата установленная галочка "Разрешить кэширование записи на диск" на вкладке "Политика" в свойствах жесткого диска. =) Отключение этого пункта может серьезно замедлить работу с диском.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Асинхронная запись (добавление) текста в файл
«
Ответ #6 :
Июнь 05, 2012, 17:45 »
Цитата: Alex_C от Июнь 05, 2012, 17:11
Хотелось бы в данном моменте вот что уточнить - по моему запись в фаил в винде идет асинхронно по определению. Вернее сама винда так делает.
То же самое и в др OC - и уже десятки лет. Более того, flush и даже закрытие файла не гарантируют физической записи на диск. Можно пояснить так: после выполнения
синхронной
записи (когда управление вернулось приложению) размер файла будет с учетом записанного и приложение может прочитать записанное. Для
асинхронной
записи это неверно. А уж как там ОС кеширует - его личное дело. В Mac всегда были 2 варианта ф-ций, напр PBWriteSync/PBWriteAsync. так же и для чтения
Записан
Alex_C
Гость
Re: Асинхронная запись (добавление) текста в файл
«
Ответ #7 :
Июнь 05, 2012, 22:10 »
Мммм ребят, не все так просто. Все что вы написали - я конечно знаю. Но есть Far - надеюсь все знаете такой файловый менеджер. Так вот - в первых версиях фара было все тоже - выключаешь комп - а запись не закончена. Но в последних версиях эта проблема убрана и без помощи галочки кеширования на диск. Значит как то все же можно? Пусть это будет только для винды.
Записан
V1KT0P
Гость
Re: Асинхронная запись (добавление) текста в файл
«
Ответ #8 :
Июнь 05, 2012, 22:20 »
Цитата: Alex_C от Июнь 05, 2012, 22:10
Мммм ребят, не все так просто. Все что вы написали - я конечно знаю. Но есть Far - надеюсь все знаете такой файловый менеджер. Так вот - в первых версиях фара было все тоже - выключаешь комп - а запись не закончена. Но в последних версиях эта проблема убрана и без помощи галочки кеширования на диск. Значит как то все же можно? Пусть это будет только для винды.
Если через специальные WinApi функции это сделано, то просто сравни импортируемые функции старого и нового Фара, либо проще спросить напрямую автора Фара =).
добавлено:
Погуглил, оказалось что там всего то в функции CreateFile() установить в параметре dwFlagsAndAttributes FILE_FLAG_WRITE_THROUGH и/или FILE_FLAG_NO_BUFFERING.
«
Последнее редактирование: Июнь 05, 2012, 22:25 от V1KT0P
»
Записан
Serr500
Гость
Re: Асинхронная запись (добавление) текста в файл
«
Ответ #9 :
Июнь 06, 2012, 08:19 »
Цитата: V1KT0P от Июнь 05, 2012, 22:20
Погуглил, оказалось что там всего то в функции 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
Записан
CJ1
Гость
Re: Асинхронная запись (добавление) текста в файл
«
Ответ #10 :
Июнь 06, 2012, 08:31 »
Да с FILE_FLAG_NO_BUFFERING все элементарно просто.
Просто нужно ставить количество записываемых байт кратно размеру кластера кластера диска на который ты пишешь, на WinAPI я так часто делаю, и скорость записи огромных файлов на много выше чем через буфер винды, и данные гарантом сохраняются.
А по поводу моего вопроса, то я все облазил, и вообщем понял что никак средствами Qt это не организовать, да и ладно, сделал уже по другому, без проблем.
Записан
Serr500
Гость
Re: Асинхронная запись (добавление) текста в файл
«
Ответ #11 :
Июнь 06, 2012, 08:41 »
Цитата: CJ1 от Июнь 06, 2012, 08:31
Просто нужно ставить количество записываемых байт кратно размеру кластера кластера диска на который ты пишешь
Не просто. Ещё память нужно выравнивать.
Цитата: 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
Гость
Re: Асинхронная запись (добавление) текста в файл
«
Ответ #12 :
Июнь 06, 2012, 08:53 »
Ну это из того и вытикает, я использую VirtualAlloc для этого, она выделяет память уже выровненную
Записан
DmitryM
Гость
Re: Асинхронная запись (добавление) текста в файл
«
Ответ #13 :
Июнь 06, 2012, 10:08 »
Цитата: Igors от Июнь 03, 2012, 10:39
Асинхронно - значит управление возвращается приложению без ожидания конца записи. О таких ф-циях в Qt мне ничего не известно. Если Вы имели ввиду "добавить строку в любой момент" - то это все равно синхронная запись
Можно писать в буфер, а буфер скидывать в файл по событию таймера.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Асинхронная запись (добавление) текста в файл
«
Ответ #14 :
Июнь 06, 2012, 13:40 »
Цитата: CJ1 от Июнь 06, 2012, 08:31
Да с FILE_FLAG_NO_BUFFERING все элементарно просто.
А по поводу моего вопроса, то я все облазил, и вообщем понял что никак средствами Qt это не организовать,
Интересно а как Вы собирались поймать окончание асинхронной записи? Или "сказано записать, а там хоть трава не расти"
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...