Автосохранение файлов с несколькими экземплярами

Я пишу программу Qt/C++, которая выполняет длительные симуляции, и для защиты от потери данных я написал некоторое простое поведение автосохранения. Программа периодически сохраняет во временный каталог пользователя (используя QDir::temp()), и если программа корректно закрывается, этот файл удаляется. Если программа запускается и видит файл в этом каталоге, она предполагает, что предыдущий экземпляр потерпел крах или был принудительно завершен, и предлагает пользователю загрузить его.

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

Моя программа предназначена для Windows/Mac/Linux, так как лучше всего реализовать это с помощью Qt или иным образом кроссплатформенным образом?

Редактировать: В комментариях предлагается использовать идентификатор процесса, который я могу получить с помощью QCoreApplication::applicationPid(). Мне нравится эта идея, но когда программа загружается и видит файл с определенным PID в имени, как она может просмотреть другие запущенные экземпляры (если они есть), чтобы увидеть, есть ли совпадение?


person rrwick    schedule 30.07.2014    source источник
comment
Написать имена файлов, интегрированные с pid, а при загрузке разобрать и убедиться, что каждый из них все еще работает?   -  person polarysekt    schedule 30.07.2014
comment
@polarysekt Это была моя первоначальная идея. Однако, если система дает сбой и ее необходимо отключить, всегда существует (удаленная) возможность конфликта pid. Я согласен, что это большая часть пути к решению, однако.   -  person Yuushi    schedule 30.07.2014
comment
Или сравните время последней модификации с вашим циклом обновления. сейчас - последняя модификация › цикл обновления, то это скорее всего из-за слетевшей программы. Лучше всего было бы совместить это с идеей @polarysekt..   -  person Theolodis    schedule 30.07.2014
comment
@Юши. Хорошая точка зрения. Я комментирую вместо того, чтобы отвечать, поскольку я только мозговой штурм. Поскольку я предполагаю, что система может дать сбой только частично, время безотказной работы системы также не будет надежным... Очевидно, что если бы новый запущенный pid соответствовал временному файлу, это указывало бы на сбой, но я думаю, что какой-то DDE с pid в вопросе, или какой-то сокет, поскольку только ваша программа будет отвечать определенным образом на определенные запросы. Но это может привести к большим накладным расходам, чем необходимо... хм.   -  person polarysekt    schedule 30.07.2014
comment
@rrwick: вы нашли кроссплатформенное решение своей проблемы? Я в такой же ситуации.   -  person Boris Dalstein    schedule 18.10.2014
comment
@Boris Нет, я не нашел идеального решения. Я использую идентификатор процесса для создания файлов автосохранения с уникальными именами, а затем удаляю их, когда программа корректно закрывается. Чего я не сделал, так это заставил программу искать потерянные автосохранения. Он может показать пользователю временный каталог, но пользователь может найти любые файлы, которые ему нужны.   -  person rrwick    schedule 21.10.2014


Ответы (1)


Вы можете просто использовать QSaveFile, который, как указано в документации: -

Класс QSaveFile предоставляет интерфейс для безопасной записи в файлы.

QSaveFile — это устройство ввода-вывода для записи текстовых и двоичных файлов без потери существующих данных в случае сбоя операции записи.

При записи содержимое будет записано во временный файл, и если ошибки не произошло, commit() переместит его в окончательный файл. Это гарантирует, что никакие данные в конечном файле не будут потеряны в случае ошибки во время записи, и в конечном месте никогда не будет частично записанного файла. Всегда используйте QSaveFile при сохранении целых документов на диск.

Что касается нескольких экземпляров, вам просто нужно отразить это в имени файла.

person TheDarkKnight    schedule 30.07.2014
comment
Это выглядит как хороший класс для сохранения файлов, и я действительно мог бы попробовать его использовать, но не похоже, чтобы он специально удовлетворял мои потребности в автосохранении. - person rrwick; 30.07.2014
comment
Обратите внимание, что существует также класс QTemporaryFile: qt-project.org/doc/qt -4.8/qtemporaryfile.html - person TheDarkKnight; 30.07.2014