2011-04-22 45 views
1

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

例如,我想修改主要的 vcl线程中的文件(不是很常见),并从其他线程,应用程序和服务中读取它们。

我应该用户的关键部分?我想获得关键部分修改 某些值或从主vcl线程添加xml节点和完成信号线程 文件已被修改,以便他们应该重新加载它们。

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

回答

3

对于您的具体情况最好的是Multiple Read Exclusive Write Synchronizer

注意两个critical sectionMultiple Read Exclusive Write Synchronizer只能在一个单一的过程中使用 - 你不能用它们来对共享资源的访问由两个或多个进程同步(应用程序)。

+1

+1,提及:使用XML文档的单个实例并从所有线程访问它。 TMultiReadExclusiveWriteSynchronizer确保多个读取可以同时发生,只写入块;使用单个XML文档可确保所有线程访问新数据。 – 2011-04-22 10:23:49

3

我的建议:没什么特别的!

让我们想想可能的情况:

  1. 工作者线程读取,而没有其他人在使用它的文件 - >没问题
  2. 工作者线程读取该文件,并得到一个错误,因为如有人正在使用该文件独占 - >你总是处理这种情况(例如睡眠,并在一段时间后再试一次)

只要处理这个,因为你正在执行独立的程序来阅读和写作。唯一的区别是很容易告诉工作线程某人(主线程)改变了文件的内容。关键部分由文件系统实现;-)

0

您可以在写入时创建一个互斥对象,并且只有互斥对象不存在时,其他线程才可以读取该对象。

0

我建议使用windows文件锁定。最初,我将首先让每个线程在尝试访问文件时使用正确的标志 - 只读使用该标志的标志,而写标志使用拒绝读写。由于读取文件应该很快,应该可以正常工作 - 写入线程需要重新尝试拒绝访问,但这应该相当少见。这很大程度上取决于阅读发生的频率。从你的描述中,它不应该是一个问题。

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