2008-09-16 14 views
12

Me gustaría poder abrir un TDataSet de forma asíncrona en su propio hilo para que el hilo principal de la VCL pueda continuar hasta que se complete y luego leer el hilo VCL principal de ese TDataSet. He hecho algunos experimentos y he entrado en situaciones muy extrañas, así que me pregunto si alguien ha hecho esto antes.En Delphi, ¿es seguro el subproceso TDataSet?

He visto algunas aplicaciones de muestra donde se crea un TDataSet en un hilo separado, se abre y luego se leen los datos, pero eso se hace en el hilo por separado. Me pregunto si es seguro leer desde el TDataSet desde el hilo principal de VCL después de que el otro hilo abra la fuente de datos.

Estoy haciendo la programación Win32 en Delphi 7, usando TmySQLQuery desde DAC for MySQL como mi descendiente TDataSet.

Respuesta

5

Siempre que desee utilizar el conjunto de datos en su propio hilo, puede usar la sincronización para comunicarse con el hilo principal de cualquier actualización de VCL/UI, como con cualquier otro componente.
O, mejor aún, puede implementar la comunicación entre el subproceso principal y los subprocesos de trabajo con su propio sistema de mensajería.

cheque solución de Hallvard para roscar aquí:
http://hallvards.blogspot.com/2008/03/tdm6-knitting-your-own-threads.html

o esta otra:
http://dn.codegear.com/article/22411

alguna explicación en sincronizar y sus ineficiencias:
http://www.eonclash.com/Tutorials/Multithreading/MartinHarvey1.1/Ch3.html

+4

Enhebrado se puede hacer de una manera mucho más simple: http://otl.17slon.com – gabr

+0

Me di cuenta de las preguntas frecuentes de la OmniThreadLibrary (enlace en el comentario anterior) que solo es compatible con Delphi 2007 y 2009. ¿Alguien lo ha utilizado en D7? –

3

Lo he visto hecho con otras implementaciones de TDataSet, concretamente en los componentes Asta. Éstos se pondrían en contacto con el servidor, regresarían de inmediato y luego activarían un evento una vez que se hubieran cargado los datos.

Sin embargo, creo que depende mucho del componente. Por ejemplo, esos mismos componentes Asta no se podrían abrir de forma síncrona desde cualquier cosa que no sea el hilo VCL principal.

En resumen, no creo que sea una limitación de TDataSet per se, sino más bien algo específico de la implementación, y no tengo acceso a los componentes que ha mencionado.

3

Una cosa a tener en cuenta sobre el uso del mismo TDataSet entre múltiples hilos es que solo puede leer el registro actual en cualquier momento. Entonces, si estás leyendo el registro en un hilo y luego el otro hilo llama al Next, entonces estás en problemas.

2

Recuerde también que es muy probable que el hilo necesite su propia conexión a la base de datos. Creo que lo que se necesita aquí es un objeto de "espera" de subprocesos múltiples para cargar los datos del subproceso en (solo escritura) que luego solo se lee desde el subproceso principal de la VCL. Antes de leer utilice algún tipo de método de sincronización para asegurarse de no leer en el mismo momento su escritura, o escribir en el mismo momento su lectura, o cargar todo en un archivo de memoria y escribir un método de sincronización para indicarle a la aplicación principal en qué parte del archivo para de leer.

He realizado el último acercamiento varias veces, depindiendo el número de registros esperados (y el tamaño del conjunto de datos) Incluso he llevado esto a un archivo de disco físico en el sistema local. Funciona bastante bien.

1

que he hecho acceso a datos multiproceso, y no es sencillo:

1) Debe crear una sesión por hilo.

2) Todo lo que se haga en esa instancia de TDataSet debe hacerse en el contexto de la secuencia donde se creó. No es fácil si quieres colocar, p. una grilla db en la parte superior.

3) Si quiere dejar, p. juego de hilos principal con sus datos, la solución directa es moverlo a un contenedor separado de algún tipo, p. ej. un conjunto de datos de memoria.

4) Necesita algún tipo de mecanismo de señalización para notificar el hilo principal una vez que se complete su recuperación de datos.

... y manejo de excepciones no es sencilla, ya sea ...

Pero: Una vez que usted ha tenido éxito, la aplicación va a ser muy elegante!

0

La mayoría de los TDatasets no son seguros para subprocesos. Uno que sé que es seguro para subprocesos es kbmMemtable. También tiene la capacidad de clonar un conjunto de datos para que ocurra el problema de mover el puntero del registro (como lo explica Jim McKeeth). Son uno de los mejores conjuntos de datos que puedes obtener (comprado o gratis).

Cuestiones relacionadas