Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用多个实例自动保存文件_C++_Qt_Cross Platform_Autosave - Fatal编程技术网

C++ 使用多个实例自动保存文件

C++ 使用多个实例自动保存文件,c++,qt,cross-platform,autosave,C++,Qt,Cross Platform,Autosave,我正在编写一个Qt/C++程序,它可以进行长时间运行的模拟,为了防止数据丢失,我编写了一些简单的自动保存行为。程序使用QDir::temp定期保存到用户的temp目录,如果程序正常关闭,该文件将被删除。如果程序启动并在该目录中看到该文件,它将假定前一个实例崩溃或被强制终止,并提示用户加载该实例 现在这里是复杂的-我希望这个功能能够正常工作,即使同时使用多个程序实例。因此,当程序加载时,它不能只查找是否存在自动保存文件。如果找到一个,它需要确定该文件是否是由正在运行的实例创建的,在这种情况下,没有

我正在编写一个Qt/C++程序,它可以进行长时间运行的模拟,为了防止数据丢失,我编写了一些简单的自动保存行为。程序使用QDir::temp定期保存到用户的temp目录,如果程序正常关闭,该文件将被删除。如果程序启动并在该目录中看到该文件,它将假定前一个实例崩溃或被强制终止,并提示用户加载该实例

现在这里是复杂的-我希望这个功能能够正常工作,即使同时使用多个程序实例。因此,当程序加载时,它不能只查找是否存在自动保存文件。如果找到一个,它需要确定该文件是否是由正在运行的实例创建的,在这种情况下,没有任何错误,也没有什么可以做的,或者它是否是由崩溃或强制结束的实例遗留下来的,在这种情况下,它应该提示用户加载它

我的程序是针对Windows/Mac/Linux的,那么使用Qt或其他跨平台方式实现这一点的最佳方式是什么

编辑: 这些评论建议使用进程标识符,我可以使用QCoreApplication::applicationPid获得该标识符。我喜欢这个想法,但当程序加载并看到一个文件名中带有特定PID时,它如何查看其他正在运行的实例(如果有的话)以查看是否存在匹配?

您可以简单地使用它,如文档所述:-

QSaveFile类提供了一个安全写入文件的接口

QSaveFile是一种I/O设备,用于写入文本和二进制文件,在写入操作失败时不会丢失现有数据

写入时,内容将写入一个临时文件,如果没有发生错误,commit将把它移动到最终文件。这样可以确保在写入时发生错误时,最终文件中的数据不会丢失,并且最终位置中不会出现部分写入的文件。将整个文档保存到磁盘时始终使用QSaveFile


对于多个实例,您只需要在文件名中反映出来。

编写与pid集成的文件名,并在加载时解析并确保每个实例仍在运行?@polarysekt这是我最初的想法。但是,如果系统崩溃并且必须关闭,则始终存在发生冲突的PID的远程可能性。不过,我同意这是解决问题的绝大多数方法。或者将上次修改时间与您的更新周期进行比较。现在-上一次修改>更新周期,那么它可能来自崩溃的程序。最好是将其与@polarysekt的想法结合起来。@Yuushi。说得好。我只是发表评论而不是回答,因为我只是头脑风暴。因为我认为一个系统可能只是部分崩溃,系统正常运行时间也不可靠。。。显然,如果新运行的pid与tempfile匹配,这将表明崩溃,但我认为某种类型的DDE与所讨论的pid匹配,或者某种类型的套接字,因为只有您的程序才会以某种方式响应某些查询。但这可能会导致比必要的更多的开销。。。hrm@rrwick:您是否找到了解决问题的跨平台解决方案?我也有同样的情况。这看起来是一个很好的保存文件的类,实际上我可能会尝试使用它,但它似乎并没有专门满足我的自动保存需要。请注意,还有一个QTemporaryFile类: