Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Raks123 от Июнь 16, 2012, 18:14



Название: Хитрый способ визуализации содержимого файла
Отправлено: Raks123 от Июнь 16, 2012, 18:14
У меня возникла проблема: мне нужно как то ухитриться открыть открыть файл. Беда в том, что в файл постоянно (через промежутки в 100-125 миллисекунд) записывается информация. Я кое-что заметил, что если открыть текстовым редактором этот файл, то запись продолжится без каких либо погрешностей. В визуализации я бум бум, да и процесс осложняется тем, что приложение кросс платформенное. Вообще можно ли "вшить" в программу текстовый редактор? Да и как искать текстовые редакторы линуха? Может у кого есть предложение получше?


Название: Re: Хитрый способ визуализации содержимого файла
Отправлено: Igors от Июнь 16, 2012, 19:04
Зачем хитрить и лезть в окно если дверь-то открыта? :)  Открываете файл в режиме ReadOnly, читаете и загружаете напр в QPlainTextEdit, С определенным интервалом времени (напр 2 сек) проверяете изменилась ли дата или размер файла, если да - перечитываете. Возможно есть способ и лучше, но и этот несложен и неплох. Заметим что изменения зависят от пишущего. Напр есои он кеширует вывод, то добавляться будут большие куски (а не по строке).


Название: Re: Хитрый способ визуализации содержимого файла
Отправлено: maint от Июнь 16, 2012, 19:04
открыть только по чтению и через промежутки читать файл до EOF и писать все это дело на, ну скажем в QListWidget


Название: Re: Хитрый способ визуализации содержимого файла
Отправлено: Raks123 от Июнь 16, 2012, 19:07
А режим чтения не будет конфликтовать, если файл в это время открыт только для записи?


Название: Re: Хитрый способ визуализации содержимого файла
Отправлено: mutineer от Июнь 16, 2012, 21:28
А режим чтения не будет конфликтовать, если файл в это время открыт только для записи?

Не должен, но самый лучший способ узнать - попробовать


Название: Re: Хитрый способ визуализации содержимого файла
Отправлено: pastor от Июнь 17, 2012, 02:07
Здесь может пригодиться QFileSystemWatcher


Название: Re: Хитрый способ визуализации содержимого файла
Отправлено: Bepec от Июнь 17, 2012, 09:26
Watcher не реагирует на изменение размеров файла :) Так же на изменение его атрибутов и открытие/закрытие файла.

Однако если его допилить, то будет. Где то даже темка такая была.


Название: Re: Хитрый способ визуализации содержимого файла
Отправлено: alexman от Июнь 17, 2012, 09:43
Watcher не реагирует на изменение размеров файла :) Так же на изменение его атрибутов и открытие/закрытие файла.

Однако если его допилить, то будет. Где то даже темка такая была.
Тыкни на допиленный вариант?


Название: Re: Хитрый способ визуализации содержимого файла
Отправлено: pastor от Июнь 17, 2012, 14:01
Цитировать
Watcher не реагирует на изменение размеров файла

QFileSystemWatcher реагирует на модификацию файла и нам этого предостаточно. Не знаю как в Qt 4.8.х, но до 4.6.3 это работало.

Цитировать
The fileChanged() signal is emitted when a file has been modified, renamed or removed from disk.

Как уже сказал Igors, здесь есть проблема со стороны буфферизированного вывода (буфер QFile, буфер ОС). Данные не сразу попадут в файл и, как следствие, визуализация лога будет происходить блоками.


Название: Re: Хитрый способ визуализации содержимого файла
Отправлено: Bepec от Июнь 17, 2012, 15:05
4.7.x - не работает на изменение/добавление/удаление информации из файла и изменение его атрибутов. Причём повторюсь - не только у меня ;) Была и темка про это.

Искать... Лень.. Воскресенье...


Название: Re: Хитрый способ визуализации содержимого файла
Отправлено: pastor от Июнь 17, 2012, 16:25
4.7.x - не работает на изменение/добавление/удаление информации из файла и изменение его атрибутов. Причём повторюсь - не только у меня ;) Была и темка про это.

Вспоминается такая проблема была когда мониторишь директорию. При изменении контента файла directoryChanged не испускался. Как сейчас обстоят дела именно с fileChanged - хз. Было бы неплохо увидеть тред с описанием проблемы и примером. На трекере по этому поводу инфы нет.


Название: Re: Хитрый способ визуализации содержимого файла
Отправлено: Patrin Andrey от Июнь 18, 2012, 08:27
Вспоминается такая проблема была когда мониторишь директорию. При изменении контента файла directoryChanged не испускался.
Никогда им не пользовался, но лично мне показалось бы странным, если бы при изменении контента файла, испускался directoryChanged


Название: Re: Хитрый способ визуализации содержимого файла
Отправлено: pastor от Июнь 18, 2012, 14:04
Никогда им не пользовался, но лично мне показалось бы странным, если бы при изменении контента файла, испускался directoryChanged

Это написано в документации, никакой отсебятины:

Цитировать
void QFileSystemWatcher::directoryChanged ( const QString & path ) [signal]
Цитировать
This signal is emitted when the directory at a specified path, is modified (e.g., when a file is added, modified or deleted) or removed from disk.


Название: Re: Хитрый способ визуализации содержимого файла
Отправлено: Bepec от Июнь 18, 2012, 18:32
Суть проблемы проста - нужно мне как то было отследить изменение размеров файла и их появление (тырилку видео с сайтов, простейшую). Соответственно ставил watcher на папку кеша и ждал, когда 1 из файликов начнёт увеличиваться :) Ну и до тех пор, пока он не прекратит толстеть :)

В результате - сигнал был только при появлении файлов. При удалении, модифицировании и увеличение размера была тиш да благодать. Пришлось чуть смухлевать и свой класс накарябать на это ориентированный.

PS исходники Qt я пока не трогаю - боюсь :D


Название: Re: Хитрый способ визуализации содержимого файла
Отправлено: pastor от Июнь 18, 2012, 19:10
Да, с этим была проблема и исправлять это не думают. Остановились лишь на том, что это недочет в документации по сигналу directoryChanged. fileChanged сигнал должен работать как ожидается.