Estoy programando la aplicación de subprocesos múltiples. Tengo dos hilos. Activado es para transferir algunos datos del dispositivo al búfer de datos global y el segundo es para escribir esos datos en un archivo.¿La mejor práctica sobre cómo esperar datos dentro de un hilo y escribirlos en un archivo?
Los datos del dispositivo al búfer se transfieren de forma asíncrona. El propósito del segundo hilo debe ser esperar a que se escriba la cantidad especificada de datos en el búfer de datos principal y, finalmente, escribirlo en el archivo.
Bueno, el primer hilo está en DLL y el segundo en la aplicación principal. Temporalmente resuelvo esto con eventos. El primer hilo transfiere datos desde el dispositivo al búfer principal de datos y cuenta los datos, y cuando se transfiere una cantidad específica de datos, establece un evento. El segundo espera a que se señalice el evento y, cuando lo hace, ejecuta un código para el almacén de datos. Tan simple como que está funcionando.
Thread1.Execute:
var DataCount, TransferedData: Integer;
DataCounter := 0;
while not Terminted do
begin
TransferData(@pData, TransferedData);
Inc(DataCounter, TransferedData)
if DataCounter >= DataCountToNotify then SetEvent(hDataCount);
end;
Thread2.Execute:
hndlArr[0] := hDataCount;
hndlArr[1] := hTerminateEvent;
while (not Terminated) do
begin
wRes := WaitForMultipleObjects(HandlesCount, Addr(hndlArr), false, 60000);
case wRes of
WAIT_OBJECT_0:
begin
Synchronize(WriteBuffer); // call it from main thread
ResetEvent(hndlArr[0]);
end;
WAIT_OBJECT_0 + 1:
begin
ResetEvent(hTerminateEvent);
break;
end;
WAIT_TIMEOUT: Break;
end;
end;
Ahora me gustaría hacer segundo hilo más independiente ... así que puedo hacer varias instancias del segundo hilo y no tener que esperar para el primer hilo. Me gustaría mover los datos que cuentan parte del código del primer subproceso al segundo, así que ya no necesitaré contar los datos en el primer subproceso. El primero será solo para fines de transferencia de datos.
Me gustaría utilizar el segundo como contador de datos y almacenar datos. Pero ahora tendré que hacer un ciclo y revisar constantemente la cantidad de datos especificada manualmente. Si tuviera while loop tendré que agregar algo de reposo para que el segundo subproceso no disminuya el rendimiento de la computadora, pero no sé por cuánto tiempo debería dormir mientras la velocidad de transferencia de datos en el primer hilo no es constante y por lo tanto la velocidad de conteo en el segundo hilo variará.
Mi conjetura que este ejemplo de código no es bueno:
Thread2.Execute:
var DataCount: Integer;
DataIdx1 := GetCurrentDataIdx;
while (not Terminated) do
begin
if (GetCurrentDataIdx - DataIdx1) >= DataCountToNotify then
begin
Synchronize(WriteBuffer);
DataIdx1 := GetCurrentIdx;
end;
sleep(???);
end;
Así que mi pregunta es ¿cuál es el mejor enfoque para resolver ese problema con el recuento de datos y su almacenamiento dentro del segundo hilo? ¿Cuáles son sus experiencias y sugerencias?
¿Por qué fuerza la escritura del archivo al hilo principal, 'Sincronizar (WriteBuffer)'? No entiendo cómo logrará multiplicar el segundo hilo y aún mantener el orden de escritura en un solo archivo. –
El subproceso se multiplicará pero los datos se almacenarán en diferentes archivos. No escribí nada, voy a escribirlo en el mismo archivo. Mi objetivo es tener múltiples controles que puedan almacenar datos de la misma fuente en diferentes archivos. – Nix
Eso es bueno saberlo, ya que la respuesta dependerá de esta información. Todavía me pregunto por qué la escritura del archivo debe aplicarse al hilo principal. –