Cómo administrar simultáneos de Entrada/Salida de acceso a un archivo XML de varias instancias de un EXE, el uso de Delphi.

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

  •  01-07-2019
  •  | 
  •  

Pregunta

Tengo una herramienta de línea de comandos, escrito en Delphi, que el trabajo es para insertar un nodo en un archivo XML y, a continuación, salga inmediatamente.Necesito hacer posible que varias instancias de la herramienta para ser ejecutados simultáneamente e insertar los nodos de a uno y el mismo XML.

Para lograr este propósito he introducido un simple archivo "mutex" - la herramienta crea un archivo temporal antes de escribir en XML y, a continuación, elimina el archivo temporal después de terminado de escribir.Así, si otro ejemplo es ejecutado, se comprueba la presencia de este archivo temporal y espera hasta que se elimina.Entonces se crea de nuevo el archivo temporal, se escribe en el XML y elimina el archivo temporal.

El problema es que esto funciona bien sólo cuando 2-3 instancias de intentar escribir en el archivo XML de forma simultánea.Cuando hay más casos - algunos de ellos sólo tiene que esperar para siempre y nunca anexar el nodo en el archivo XML.

Existe una mejor forma de hacer el trabajo con un gran número de instancias en ejecución y escritura en el XML al mismo tiempo?

¿Fue útil?

Solución

Un nombre o semáforo mutex puede hacer esto para usted en una sola máquina.Por ejemplo, el uso deTMutex de SyncObjs, y el uso de uno de los constructores que toma un argumento de nombre.Si utiliza el mismo nombre en todas las aplicaciones que se sincronizan a través de la misma núcleo de exclusión mutua.Uso TMutex.Adquirir para el acceso, y TMutex.Liberación cuando hayas terminado, protegida en un try/finally bloque.

El uso de la TMutex.Crear la sobrecarga que tiene un InitialOwner argumento, pero especifica False para esto (a menos que desee adquirir el mutex de inmediato, por supuesto).Esta sobrecarga de llamadas CreateMutex detrás de las escenas.Buscar en la fuente a SyncObjs y la documentación para CreateMutex para detalles adicionales.

Otros consejos

1 - crear un archivo que registra los cambios pendientes (funciona como una cola)

2 - Escribir una simple app para ver ese archivo, y aplicar los cambios en el archivo XML

3 - Modificar la actual herramienta de línea de comandos para anexar sus solicitudes de cambio a los "cambios Pendientes" archivo

Ahora solo una aplicación tiene que tocar el final del archivo XML.

TXMLDocument ya impide que varias instancias de la escritura para el mismo archivo al mismo tiempo.Así que supongo que lo que su pregunta es, "¿Cómo puedo abrir un documento XML para la lectura, evita que otras instancias de la escritura del documento, mientras estoy leyendo, y , a continuación, escribir en el documento antes de permitir que otras instancias para hacer la misma cosa?"

En este caso, usted debe controlar la apertura y cierre del mismo archivo, en lugar de permitir que TXMLDocument que lo haga por usted.El uso de un TFileStream para abrir el archivo con un exclusivo de lectura y escritura de bloqueo y XMLDocument.LoadFromStream en lugar de LoadFromFile.Guardar el documento con SaveToStream después de restablecer la corriente.Posición a 0.El uso de un try/finally con el fin de asegurarse de que usted cierre el flujo cuando haya terminado con él.Puesto que usted está exclusivamente de cierre el archivo, ya no necesita el archivo temporal o cualquier otro tipo de exclusión mutua.

Obviamente, abrir el archivo podría fallar si otro ejemplo es en la actualidad de lectura/escritura.Así que hay que manejar esto y vuelva a intentarlo más tarde.

Sólo recuerde que cada vez que usted necesita para añadir un nodo, el documento completo se debe volver a cargar y reparsed.Dependiendo del tamaño del documento XML y los datos que se están salvando, podría no ser el método más eficiente para la transferencia de datos.

El enfoque de la escritura a un archivo separado, es una solución interesante, a tener en cuenta sería el de su "varias instancias de" apps escribir únicos archivos XML y, a continuación, la carga de los en un documento maestro con un programa independiente mediante un FindFirst bucle.De esa manera usted puede mantener su estructura xml prácticamente intacto, sin grandes cambios en sus programas existentes.

De esta respuesta:

En Windows, esto es posible si usted puede controlar ambos programas.LockFileEx.Para lee, abrir un bloqueo compartido en el archivo de bloqueo.Para las escrituras, abrir un bloqueo exclusivo en el archivo de bloqueo.El bloqueo es raro en Windows, así que recomiendo el uso de un bloqueo independiente de archivo de esta.

("Tanto los programas de los dos no se aplique en su caso es el mismo programa, sólo se ejecuta en varias instancias.)

Nota de lado / cómo he encontrado esta respuesta:El registro de Java biblioteca logback utiliza la plataforma específica de bloqueo de archivo API (a través de NIO) para implementar la 'prudente de modo'donde varios procesos pueden iniciar sesión en el mismo archivo, sin que se dañe algo que iiuc no es posible con el Delphi RTL operaciones de archivo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top