Red de conocimiento informático - Computadora portátil - Cómo utilizar subprocesos múltiples para la recopilación de datos en Delphi

Cómo utilizar subprocesos múltiples para la recopilación de datos en Delphi

Explique cómo utilizar subprocesos múltiples para la recopilación de datos en Delphi desde los dos aspectos siguientes:

---- 1. Problemas que deben resolverse mediante subprocesos múltiples para la recopilación de datos

p>

---- De hecho, la complejidad de la programación de subprocesos múltiples es temporal; si usa C tradicional para el diseño de subprocesos múltiples, debe controlar la sincronización entre subprocesos usted mismo. Eso sería complicado. Sin embargo, si utiliza métodos de diseño orientado a objetos y utiliza Delphi para programación multiproceso, el problema será mucho más sencillo. Esto se debe a que Delphi ha manejado la complejidad de los subprocesos múltiples por nosotros y todo lo que tenemos que hacer es heredar.

---- Específicamente, la recopilación de datos multiproceso debe completar el siguiente trabajo:

---- ① Derive su propia clase SampleThread de la clase TThread. Esta es la clase que utilizamos para la recopilación de datos. Al recopilar, simplemente cree una instancia de SampleThread.

---- ② Sobrecarga el método Execute de la superclase TThread. En este método, la tarea de recolección de datos se realizará específicamente.

---- ③ Si desea recopilar y mostrar al mismo tiempo, escriba varios procesos para mostrar el progreso de la recopilación para que el método Execute llame.

----Los atributos/métodos más utilizados en la clase TThread son los siguientes:

Método Crear: constructor Crear

(CreateSuspended: booleano) ;

---- El parámetro CreateSuspended determina si el hilo se ejecutará inmediatamente después de su creación. Si es Verdadero, el nuevo hilo se suspende después de la creación; si es Falso, el hilo se ejecuta inmediatamente después de la creación.

Propiedad FreeOnTerminate:

propiedad FreeOnTerminate: Boolean;

---- Esta propiedad determina si el programador es responsable de cancelar el hilo. Si esta propiedad es Verdadera, VCL destruirá automáticamente el objeto del subproceso cuando el subproceso finalice. Su valor predeterminado es Falso.

Propiedad OnTerminate:

propiedad OnTerminate: TNotifyEvent;

---- Esta propiedad especifica un evento que ocurre cuando el hilo termina.

---- Veamos un ejemplo específico:

---- 2. Implementación de recopilación de datos multiproceso

---- Este Es un programa desarrollado por el autor para medir el diagrama de rendimiento de una unidad de bombeo. Su función es recopilar los datos de carga y desplazamiento del punto de suspensión de la unidad de bombeo y luego hacer un diagrama de trabajo de la unidad de bombeo después del procesamiento. La Figura 1 (omitida) muestra la interfaz durante la recopilación de datos. Después de hacer clic en el botón "Recopilar datos", el programa creará un nuevo hilo y establecerá sus propiedades. Este nuevo hilo completará la tarea de recopilación de datos.

El programa es el siguiente:

Procedimiento TsampleForm.

DoSampleBtnClick(Sender: TObject);

Comenzar

ReDrawBtn.Enabled := Verdadero;

DoSampleBtn.Enabled := False;

FFTBtn.Enabled := Verdadero;

TheSampler := SampleThread.Create(False);

Crear un hilo de colección

TheSampler.OnTerminate := FFTBtnClick;

Tareas que se ejecutarán una vez completada la colección

TheSampler.FreeOnTerminate := True;

Deshacer después de que se complete la colección

Fin;

---- La definición de clase del hilo de la colección es la siguiente:

Tipo

SampleThread = clase(TThread)

Pública

función AdRead(ach: byte): entero llamada segura;

Función para leer tarjeta A/D

procedimiento UpdateCaption;

Mostrar el tiempo de cobro

privado

{ Declaraciones privadas }

protegido

thes, thep: real;

dt: real;

id: entero;

st, ed: LongInt;

procedimiento Ejecutar; anular;

Esta es la clave.

Fin;

---- En esta clase, se define una función AdRead para operar la tarjeta A/D. Los dos procesos se utilizan para mostrar el progreso y el tiempo de recolección. . Cabe señalar que la función AdRead está escrita en ensamblador y el formato de llamada de parámetros debe ser una llamada segura.

----El código del método de clave sobrecargada Ejecutar es el siguiente:

Procedimiento SampleThread.Execute;

Comenzar

StartTicker: = GetTickCount;

id := 0;

Repetir

estos := Adread(15) * ad2mv * mv2l;

Recopilar canal 15

thep := Adread(3) * ad2mv * mv2n;

Recopilar canal 3

dt := GetTickCount - StartTicker;

sarray[id] := thes;

parray[id] := thep;

tarray[id] := dt;

inc (id);

Sincronizar(UpdateCaption);

Nota: muestra el progreso de la recopilación

Hasta id >=4096;

ed: = GetTickCount;

Synchronize(ShowCostTime);

Nota: Muestra el tiempo invertido

fin;

---- Desde el Código anterior Como se puede ver en , no existe una diferencia esencial entre Ejecutar y el código ordinario.

La única diferencia es que al mostrar el progreso de la recopilación y mostrar el tiempo transcurrido, los procedimientos respectivos no se pueden llamar directamente, sino indirectamente llamando a Synchronize. Esto se hace para mantener la sincronización entre procesos.