您好 在我的应用程序中,我将某些信息保存在xml external中 光盘上的文件。我想访问并只是从其他线程读取此文件 和应用程序或服务同时进行。
例如,我想从main修改文件(不经常) vcl线程,只是从其他线程,应用程序和服务中读取它们。
我应该使用关键部分吗?我正在考虑获取关键部分修改 一些值或从主vcl线程添加xml节点以及完成信号线程时 该文件已被修改,因此他们应该重新加载它们。
有什么建议吗?我使用delphi 2009 win32。
答案 0 :(得分:3)
对于您的特定情况,最好的是Multiple Read Exclusive Write Synchronizer
请注意,critical section
和Multiple Read Exclusive Write Synchronizer
只能在单个进程中使用 - 您无法使用它们来同步对来自两个或多个进程(应用程序)的共享资源的访问。 / p>
答案 1 :(得分:3)
我的建议:什么都不做!
让我们考虑可能的情况:
当你正在实施独立的阅读和写作程序时,只需处理这个问题。唯一的区别是很容易向工作线程发出信号,表明有人(主线程)改变了文件的内容。关键部分由文件系统实现; - )
答案 2 :(得分:0)
您可以在写入时创建互斥对象,如果只有互斥对象不存在,则其他线程可以读取。
答案 3 :(得分:0)
我建议使用Windows文件锁定。最初,我首先尝试访问文件时使每个线程使用正确的标志 - 只读取使用该标志的标志,写入标志使用write-deny-read。由于读取文件应该很快,应该可以正常工作 - 写入线程需要在拒绝访问时重试,但这应该是相当罕见的。这很大程度上取决于阅读的频率。根据您的描述,它应该不是问题。
如果写入线程由于读取线程而阻塞太多,您可以尝试写入-allow-read锁定并查看是否有效。它可能。如果没有,请尝试在编写时将文件截断为第一步。因此,打开文件,将长度设置为零并刷新,然后在一次写入内存之前在内存中构建新文件(MemoryStream.SaveToFile,然后刷新或关闭)。