Delphi를 사용하여 EXE의 여러 인스턴스에서 XML 파일에 대한 동시 입출력 액세스를 관리하는 방법.

StackOverflow https://stackoverflow.com/questions/101316

  •  01-07-2019
  •  | 
  •  

문제

XML 파일에 노드를 삽입한 다음 즉시 종료하는 작업인 Delphi로 작성된 명령줄 도구가 있습니다.도구의 여러 인스턴스를 동시에 실행하고 하나의 동일한 XML에 노드를 삽입할 수 있도록 해야 합니다.

이 목적을 달성하기 위해 나는 간단한 파일 "뮤텍스"를 도입했습니다. 이 도구는 XML에 쓰기 전에 하나의 임시 파일을 생성한 다음 쓰기가 완료된 후 임시 파일을 삭제합니다.따라서 다른 인스턴스가 실행되면 이 임시 파일이 있는지 확인하고 삭제될 때까지 기다립니다.그런 다음 임시 파일을 다시 만들고 XML에 쓴 다음 임시 파일을 삭제합니다.

문제는 2~3개의 인스턴스가 동시에 XML 파일에 쓰려고 할 때만 제대로 작동한다는 것입니다.더 많은 인스턴스가 있는 경우 - 그 중 일부는 영원히 기다리며 노드를 XML에 추가하지 않습니다.

동시에 실행되고 XML에 쓰는 많은 수의 인스턴스에서 작동하도록 하는 더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

명명된 세마포어 또는 뮤텍스는 단일 시스템에서 이 작업을 수행할 수 있습니다.예를 들어 사용하십시오.SyncObjs의 TMutex를 사용하고 이름 인수를 취하는 생성자 중 하나를 사용하세요.모든 애플리케이션에서 동일한 이름을 사용하면 동일한 커널 뮤텍스를 통해 동기화됩니다.액세스하려면 TMutex.Acquire를 사용하고, 완료되면 TMutex.Release를 사용해 try/finally 블록에서 보호하세요.

InitialOwner 인수가 있는 TMutex.Create 오버로드를 사용하되 이에 대해 False를 지정합니다(물론 뮤텍스를 즉시 획득하려는 경우는 제외).이 오버로드는 뒤에서 CreateMutex를 호출합니다.SyncObjs에 대한 소스와 문서를 살펴보세요. CreateMutex 자세한 내용은

다른 팁

1 - 보류 중인 변경 사항을 기록하는 파일 설정(큐처럼 작동함)

2 - 해당 파일을 볼 수 있는 간단한 앱을 작성하고 XML 파일에 변경 사항을 적용합니다.

3 - 현재 명령줄 도구를 수정하여 변경 요청을 "보류 중인 변경 사항" 파일에 추가합니다.

이제 하나의 앱만 최종 XML 파일을 다루면 됩니다.

TXMLDocument는 이미 여러 인스턴스가 동일한 파일에 동시에 쓰는 것을 방지합니다.따라서 귀하의 질문이 실제로 의미하는 것은 "읽기 위해 XML 문서를 어떻게 열 수 있습니까? 내가 문서를 읽는 동안 다른 인스턴스가 문서에 쓰는 것을 방지, 그런 다음 다른 인스턴스가 동일한 작업을 수행하도록 허용하기 전에 문서에 작성하시겠습니까?"

이 경우 TXMLDocument가 자동으로 파일을 열고 닫도록 허용하기보다는 사용자가 직접 파일 열기 및 닫기를 처리해야 합니다.TFileStream을 사용하여 LoadFromFile 대신 독점적인 읽기 및 쓰기 잠금과 XMLDocument.LoadFromStream을 사용하여 파일을 엽니다.stream.Position을 0으로 재설정한 후 SaveToStream을 사용하여 문서를 저장합니다.작업이 끝나면 스트림을 닫으려면 try/finally를 사용하세요.파일을 독점적으로 잠그기 때문에 더 이상 임시 파일이나 다른 종류의 뮤텍스가 필요하지 않습니다.

분명히 다른 인스턴스가 현재 해당 파일을 읽고 쓰고 있으면 파일 열기가 실패할 수 있습니다.따라서 이 문제를 처리하고 나중에 다시 시도해야 합니다.

노드를 추가해야 할 때마다 전체 문서를 다시 로드하고 다시 분석해야 한다는 점을 기억하세요.XML 문서의 크기와 저장하는 데이터에 따라 데이터를 전송하는 가장 효율적인 방법이 아닐 수도 있습니다.

별도의 파일에 쓰는 접근 방식은 흥미로운 솔루션입니다. 고려해야 할 방법은 "다중 인스턴스" 앱에서 고유한 XML 파일을 작성한 다음 FindFirst 루프를 사용하여 별도의 프로그램을 사용하여 해당 파일을 마스터 문서에 로드하는 것입니다.이렇게 하면 기존 프로그램을 크게 변경하지 않고도 XML 구조를 거의 그대로 유지할 수 있습니다.

에서 이 답변:

Windows에서는 두 프로그램을 모두 제어할 수 있으면 가능합니다.LockFileEx.읽기의 경우 잠금 파일에 대한 공유 잠금을 엽니다.글을 쓰려면 Lockfile에서 독점 잠금을 엽니 다.잠금은 Windows에서 이상하므로 별도의 잠금 파일을 사용하는 것이 좋습니다.

('두 프로그램'은 여러 인스턴스에서 실행되는 동일한 프로그램이므로 귀하의 경우에는 적용되지 않습니다.)

참고 사항/이 답변을 찾은 방법:Java 로깅 라이브러리 로그백 NIO를 통해 플랫폼별 파일 잠금 API를 사용하여 '신중한 모드' 여러 프로세스가 동일한 파일을 손상시키지 않고 로그인할 수 있는 경우 - Delphi RTL 파일 작업에서는 불가능한 일입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top