![]() |
1
6
命名信号量或互斥量可以在单台机器上为您完成此操作。例如,使用SyncObjs中的TMutex,并使用一个接受name参数的构造函数。如果在所有应用程序中使用相同的名称,它们将通过相同的内核互斥体进行同步。使用TMutex。获取访问权限,以及TMutex。完成后释放,在try/finally块中保护。 使用TMutex。创建具有InitialOwner参数的重载,但为此指定False(当然,除非您想立即获取互斥体)。这种重载在幕后调用CreateMutex。查看SyncObjs的源代码和文档 CreateMutex 更多细节。 |
![]() |
2
4
1-设置一个记录待处理更改的文件(它将像队列一样工作) 2-编写一个简单的应用程序来查看该文件,并将更改应用于XML文件 3-修改当前的命令行工具,将他们的更改请求附加到“待定更改”文件中 现在,只有一个应用程序需要接触最终的XML文件。 |
![]() |
3
2
TXMLDocument已经防止多个实例同时写入同一文件。所以我猜你的问题真正的意思是,“我如何打开一个XML文档进行阅读, 在我阅读文档时,防止其他实例写入文档 ,然后在允许其他实例执行相同操作之前写入文档?" 在这种情况下,您应该自己处理打开和关闭文件,而不是让TXMLDocument为您完成。使用TFileStream打开具有独占读写锁和XMLDocument的文件。LoadFromStream而不是LoadFromFile。重置流后,使用SaveToStream保存文档。位置为0。使用try/finally以确保在完成流后关闭流。由于您以独占方式锁定了文件,因此不再需要临时文件或任何其他类型的互斥体。 显然,如果另一个实例当前正在读/写文件,打开文件可能会失败。因此,您需要处理此问题,稍后重试。 |
![]() |
4
1
请记住,每次需要添加节点时,都必须重新加载和重新解析整个文档。根据XML文档的大小和要保存的数据,这可能不是传输数据的最有效方法。 写入单独文件的方法是一种有趣的解决方案,可以考虑让您的“多实例”应用程序写入唯一的XML文件,然后使用FindFirst循环将这些文件加载到具有单独程序的主文档中。这样,您就可以在不对现有程序进行任何重大更改的情况下,保持xml结构的完整性。 |
![]() |
5
0
来自 this answer :
(“两个程序”不适用于您的情况,因为它是同一个程序,只是在多个实例中运行。) 旁注/我是如何找到这个答案的:Java日志库 logback 使用特定于平台的文件锁定API(通过NIO)来实现 prudent mode “多个进程可以登录到同一个文件而不会损坏它——这是Delphi RTL文件操作无法实现的。 |
![]() |
fiedel · 为什么互斥锁可以被两个线程锁定? 2 年前 |
![]() |
da cheng · 在c++11中使用条件变量使程序陷入死锁 7 年前 |
![]() |
Eunjeong Choi · 为什么此代码返回意外结果?(条件变量) 7 年前 |
![]() |
Razonixx · 从线程内增加全局计数器变量,而不必等待每个线程 7 年前 |
![]() |
Administrator · c#-等待完成2个线程中的1个 7 年前 |