XML和线程

时间:2011-04-22 08:34:35

标签: xml delphi

您好 在我的应用程序中,我将某些信息保存在xml external中 光盘上的文件。我想访问并只是从其他线程读取此文件 和应用程序或服务同时进行。

例如,我想从main修改文件(不经常) vcl线程,只是从其他线程,应用程序和服务中读取它们。

我应该使用关键部分吗?我正在考虑获取关键部分修改 一些值或从主vcl线程添加xml节点以及完成信号线程时 该文件已被修改,因此他们应该重新加载它们。

有什么建议吗?我使用delphi 2009 win32。

4 个答案:

答案 0 :(得分:3)

对于您的特定情况,最好的是Multiple Read Exclusive Write Synchronizer

请注意,critical sectionMultiple Read Exclusive Write Synchronizer只能在单个进程中使用 - 您无法使用它们来同步对来自两个或多个进程(应用程序)的共享资源的访问。 / p>

答案 1 :(得分:3)

我的建议:什么都不做!

让我们考虑可能的情况:

  1. 工作线程读取文件而其他人没有使用它 - >没问题
  2. 工作线程读取文件并收到错误,例如有人正在使用独家文件 - >你总是要处理这种情况(例如睡眠,并在一段时间后再试一次)
  3. 当你正在实施独立的阅读和写作程序时,只需处理这个问题。唯一的区别是很容易向工作线程发出信号,表明有人(主线程)改变了文件的内容。关键部分由文件系统实现; - )

答案 2 :(得分:0)

您可以在写入时创建互斥对象,如果只有互斥对象不存在,则其他线程可以读取。

答案 3 :(得分:0)

我建议使用Windows文件锁定。最初,我首先尝试访问文件时使每个线程使用正确的标志 - 只读取使用该标志的标志,写入标志使用write-deny-read。由于读取文件应该很快,应该可以正常工作 - 写入线程需要在拒绝访问时重试,但这应该是相当罕见的。这很大程度上取决于阅读的频率。根据您的描述,它应该不是问题。

如果写入线程由于读取线程而阻塞太多,您可以尝试写入-allow-read锁定并查看是否有效。它可能。如果没有,请尝试在编写时将文件截断为第一步。因此,打开文件,将长度设置为零并刷新,然后在一次写入内存之前在内存中构建新文件(MemoryStream.SaveToFile,然后刷新或关闭)。