סטנ*_*ונן 2 concurrency qt locking file read-write
我在 Windows 7 上使用 Qt5。
在我当前的项目中,我打开一个二进制文件,以便用来自 TCP 套接字的数据填充它。通常,在填充文件后,我关闭它,另一个应用程序将读取此二进制文件以进行进一步处理。
好吧,问题是:写入操作大约需要 4-5 秒(甚至更多)所以我需要找到一种方法来防止其他应用程序从二进制文件中读取,直到文件完全填充......
下面是代码(但我认为它不会有太大帮助):
int error = 0;
unsigned long dataLength;
char dataBuffer[1500];
QFile localFile("datafile.bin");
//
localFile.open(QIODevice::WriteOnly);
while(error == 0)
{
error = readSocket(dataBuffer, &dataLength);
if(error == 0)
{
localFile.write(dataBuffer, dataLength);
}
else
{
error = -1;
}
}
localFile.close();
Run Code Online (Sandbox Code Playgroud)
我正在考虑使用一个临时文件并在写操作完成后重命名它。
但也许还有另一个更好/更聪明的想法?某种“用于阅读的锁定文件”也许......?
我知道也许有点晚了,但我最近发现了一个有趣的解决方案,即一个名为“Locked File”的组件:
QtLockedFile类通过咨询锁定功能扩展了QFile。
此类通过进程间文件锁定功能扩展了 QFile 类。如果应用程序要求多个进程访问同一文件,则可以使用 QtLockedFile 轻松确保一次只有一个进程正在写入该文件,并且在其他进程读取该文件时没有进程写入该文件。
class QtLockedFile : public QFile
{
public:
enum LockMode { NoLock = 0, ReadLock, WriteLock };
QtLockedFile();
QtLockedFile(const QString &name);
~QtLockedFile();
bool open(OpenMode mode);
bool lock(LockMode mode, bool block = true);
bool unlock();
bool isLocked() const;
LockMode lockMode() const;
private:
LockMode m_lock_mode;
};
Run Code Online (Sandbox Code Playgroud)
此链接将引导您到正确的位置,其中QLockedFile类实现是: https:
//github.com/kbinani/qt-solutions/tree/master/qtlockedfile
** 所以,我决定分享这个信息,也许其他 Qt 用户感兴趣!**