Pregunta

Me gustaría poder abrir un TDataSet de forma asincrónica en su propio hilo para que el hilo principal de VCL pueda continuar hasta que esté hecho, y luego hacer que el hilo principal de VCL lea desde ese TDataSet después.He experimentado un poco y me he metido en situaciones muy extrañas, así que me pregunto si alguien ha hecho esto antes.

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

Estoy programando en Win32 en Delphi 7, usando TmySQLQuery de CAD para MySQL como mi descendiente de TDataSet.

¿Fue útil?

Solución

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

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

o este otro:
http://dn.codegear.com/article/22411

para obtener alguna explicación sobre la sincronización y sus ineficiencias:
http://www.eonclash.com/Tutorials/Multithreading/MartinHarvey1.1/Ch3.html

Otros consejos

Lo he visto hecho con otras implementaciones de TDataSet, concretamente en el asta componentes.Estos se comunicarían con el servidor, regresarían inmediatamente 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 de Asta no se pudieron abrir de manera sincrónica desde nada que no sea el hilo principal de VCL.

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

Una cosa a tener en cuenta sobre el uso del mismo Conjunto de datos T entre varios subprocesos es que solo puede leer el registro actual en un momento dado.Entonces, si estás leyendo el registro en un hilo y luego el otro hilo llama Próximo entonces estás en problemas.

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

He adoptado el último enfoque varias veces, dependiendo de la cantidad de registros esperados (y el tamaño del conjunto de datos). Incluso lo he llevado a un archivo de disco físico en el sistema local.Funciona bastante bien.

He realizado acceso a datos multiproceso y no es sencillo:

1) Necesitas crear una sesión por hilo.

2) Todo lo que se haga en esa instancia de TDataSet debe hacerse en el contexto del hilo donde se creó.Eso no es fácil si quisieras colocar, p.una cuadrícula de base de datos encima.

3) Si quieres dejar, p.e.El hilo principal juega con sus datos, la solución sencilla es moverlos a un contenedor separado de algún tipo, por ejemplo.un conjunto de datos de memoria.

4) Necesita algún tipo de mecanismo de señalización para notificar al hilo principal una vez que se completa la recuperación de datos.

...y el manejo de excepciones tampoco es sencillo...

Pero:Una vez que lo hayas logrado, ¡la aplicación será realmente elegante!

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 de registro (como lo explica Jim McKeeth).Son uno de los mejores conjuntos de datos que puede obtener (comprados o gratis).

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