Хорошо, прошло больше года, но я добавлю к этому свой комментарий, поскольку он объясняет, почему это происходит.
У меня была точно такая же проблема в многопоточном приложении с кодом, почти идентичным приведенному выше фрагменту, и у меня были критические разделы, защищающие код.
Проблема возникла наиболее легко, когда одна операция регистрации быстро следовала за другой. Вторая операция не будет выполнена по вышеуказанной причине.
Я тоже думал, что это антивирусное программное обеспечение, но ошибка произошла на одном компьютере, а не на другом, где на обоих был установлен Norton 360. Машиной с проблемой была новая Windows 7, а без - Windows XP. У коллеги также возникла проблема с запуском системы под виртуальной машиной Windows Vista без установленного средства проверки на вирусы.
Итак, мой вопрос был: «Почему эта машина XP была такой другой?».
С одной стороны, это не было девственно, и вот ответ, который кажется:
Оппортунистическая блокировка и NT-кэширование были отключены. Большинство (зрелых) разработчиков Delphi знают, что при использовании BDE они отключаются, чтобы поддерживать целостность файлов DBF и DB в многопользовательских ситуациях. Эти настройки не были отключены на более новых машинах, потому что мы больше не разрабатываем файлы данных Paradox!
Задержка кэширования записи, по-видимому, оставляет блокировку чтения / записи в файле до тех пор, пока ОС не выполнит свою работу, что может произойти через несколько миллисекунд.
Итак, в моем случае второе событие журнала было заблокировано первым.
Хорошо, я не предлагаю вам отключить оппортунистическую блокировку + NT Caching. Одна из основных причин, по которой мы отошли от BDE, заключалась в том, чтобы избегать убеждать клиентов возиться с такими настройками. Итак, есть четыре практических решения:
1) Повторить попытку в течение приемлемого периода времени, как указано в dangph .
2) открыть файл при загрузке приложения и держать его открытым в течение всего срока действия приложения. Не очень полезно, если вы запускаете несколько экземпляров приложения.
3) Лениво поместите sleep (1) перед кодом регистрации и надеемся, что этого достаточно, чтобы снять блокировку. Но это может привести к замедлению работы вашей системы, если вы ведете много журналов.
или 4) Попробуй ... кроме .. кончи код. Но тогда вы, вероятно, гарантированно пропустите 100% вторых сообщений (ссылаясь на мой случай).