用户收到间歇性错误“无法创建文件”C:... \ Filename.ini“。无法对打开了用户映射部分的文件执行请求的操作。”
我无法找到有助于了解正在发生的事情的错误。
TMemIniFile是线程安全的吗?
答案 0 :(得分:7)
据我所知,TMemIniFile(和任何其他TCustomIniFile后代)不是线程安全的。您需要将其包装到关键部分。
在这个link中,你可以找到一个线程安全的TCustomIniFile的实现(理论上由Peter TeamB编写,虽然我无法保证它。)
Embarcadero论坛上还讨论了TMemIniFile here的线程安全问题。他们谈论组件的C ++版本。
您还可以在MSDN中找到有关错误消息来源here的讨论。它有点长,但一般的结论是有2个exes试图访问同一个文件。您可以找到有关该主题的另一个讨论here。
答案 1 :(得分:5)
首先,我假设导致报告问题的特定线程配置是有多个TMemIniFile
实例,甚至可能在不同的进程中,同时从不同的线程保存。
TMemIniFile
不是线程安全的。为了避免任何竞争条件,您需要编写(伪)代码,如下所示:
AcquireLock;
Try
ReadMemIniFileFromDisk;
ModifyMemIniFileInMemory;
WriteMemIniFileToDisk;
Finally
ReleaseLock;
End;
仅锁定文件操作是不够的,因为那样你可能会因为比赛而失去更改。您必须锁定整个读/修改/写入周期。
答案 2 :(得分:0)
<强>解决方案强>
此错误消息是由AVG中的错误引起的。 AVG显然在其实时文件访问监控模式下,以独占模式打开一些文件,防止其他人写入文件。
修复方法是将AVG配置为忽略此文件所在的文件夹。
谢谢,AVG!我现在可以浪费2天的时间吗? : - )
感谢所有在此回答的人。
汤姆